云服务器内容精选
-
规则1.5 应用侧使用连接池场景,如使用连接SET设置过参数,当将连接归还连接池前,必须进行参数重置 违反规则的影响: 连接被其他业务复用时,可能会应复用其他业务设置的参数出现业务性能、业务报错等问题。 方案建议: 在将连接归还连接池之前,使用“SET SESSION AUTHORIZATION DEFAULT;RESET ALL;”重置参数。 注意: 在应用侧使用连接池的场景,如果在DWS服务侧通过GS_GUC RELOAD设置了全局的GUC参数,需要重启应用侧连接池该参数才可以生效,因为该设置只针对新建的连接生效,针对连接池中原有的连接不生效。
-
规则1.3 开启的事务最后必须提交或回滚 违反规则的影响: 事务长时间不提交,持锁阻塞ALTER等操作,进而阻塞所有业务。 大量“idle in transaction”连接,触发连接上限,导致新建连接报错。 方案建议: 默认使用autocommit自动提交方式,如关闭autocommit,则必须手动提交。 显式start transaction开启的事务,执行完相关操作后,必须显式commit/rollback结束事务。
-
建议4.1 避免使用复杂的存储过程,避免存储过程嵌套 违反规范的影响: 复杂和嵌套的存储过程维护成本高,故障定位难度大,恢复耗时长。 方案建议: 不使用存储过程或只使用一层存储过程,不嵌套。 开发存储过程设计对应的日志表,将关键步骤前后的信息记录到日志表中,操作步骤如下。 保存并查看日志操作步骤 创建日志表。 1 2 3 4 5 6 7 8 9 CREATE TABLE func_exec_log ( id varchar2(32) default lower(sys_guid()), pro_name varchar2(60), exec_times int, log_date date, deal_date date, log_mesage text ); 创建表和导入数据。 1 2 CREATE TABLE demo_table(data_id int, data_number int); INSERT INTO demo_table values(generate_series(1,1000),generate_series(1,1000)); 创建业务存储过程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 CREATE OR REPLACE FUNCTION demo_table_process(out exe_info text) LANGUAGE plpgsql AS $$ declare v_count int; pro_result text; fun_name text; exec_times int; begin fun_name := 'demo_table_process'; select nvl(max(exec_times), '0') + 1 into exec_times from func_exec_log where pro_name = fun_name; --业务表插入数据 insert into demo_table values (dbms_random.value(1, 1000)::int,generate_series(1, dbms_random.value(10000, 20000)::int)); get diagnostics v_count = ROW_COUNT; exe_info = sysdate || '# step1:insert count:' || v_count || ' rows;'; --删除业务表指定数据 delete from demo_table where data_id = dbms_random.value(1, 1000)::int; get diagnostics v_count = ROW_COUNT; exe_info = exe_info || sysdate || '# step2:delete count:' || v_count || ' rows;'; --更新业务表数据 update demo_table set data_number = dbms_random.value(1, 100)::int where data_id = dbms_random.value(1, 1000)::int; exe_info = exe_info || sysdate || '# step3:update count:' || sql%rowcount || ' rows'; --在整个程序结束前记录日志,也可以在每个步骤结束后分别记录日志,也可以创建记录日志的函数供调用,灵活使用即可 insert into func_exec_log(pro_name, exec_times, log_date, deal_date, log_mesage) values (fun_name,exec_times,sysdate,split_part(regexp_split_to_table(exe_info, ';'), '#', 1),split_part(regexp_split_to_table(exe_info, ';'), '#', 2)); --EXCEPTION用于保证当insert/update/delete等操作步骤异常退出时,也能够正常记录日志 EXCEPTION WHEN OTHERS THEN pro_result := exe_info || sysdate || '# exception error message is: ' || sqlerrm; insert into func_exec_log(pro_name, exec_times, log_date, deal_date, log_mesage) values(fun_name,exec_times,sysdate,split_part(regexp_split_to_table(pro_result, ';'), '#', 1),split_part(regexp_split_to_table(pro_result, ';'), '#', 2)); END; $$; 调用存储过程(正常执行)。 1 SELECT demo_table_process(); 查看日志(确认业务运行情况)。 SELECT * FROM func_exec_log ORDER BY log_date desc,deal_date,log_mesage; 再次调用存储过程(构造执行异常)。 SELECT demo_table_process(); --先删除demo_table的data_number列构造异常,之后再调用 查看日志(确认业务运行情况)。
-
程序编写原则 在PL/pgSQL中的SQL语句宜使用绑定变量。 在PL/pgSQL中的SQL语句宜使用RETURNING子句。 存储过程使用原则: 对于单个存储过程中varchar或者varchar2类型输出参数个数不应超过50个。 不应使用long类型作为输入或输出参数。 对于大小超过10MB的字符串类型输出,应使用CLOB类型。 变量声明原则: 变量声明时,如果含义和应用表某字段含义或某变量相同时,应使用%TYPE声明。 记录声明时,如果含义和某应用表行数据相同时,应使用%ROWTYPE声明。 变量声明每行应只包含一条语句。 不应声明LONG类型的变量。 游标使用类型: 显式游标使用后应关闭。 游标变量使用后应关闭。若游标变量需要传递数据给调用的应用程序,应在应用程序中关闭游标;若游标变量仅在存储过程中使用,应显式关闭游标。 在使用DBMS_SQL.CLOSE_CURSOR关闭游标前,应使用DBMS_SQL.IS_OPEN判断游标是否已打开。 集合使用原则:引用集合中的元素时宜使用FORALL语句,不宜使用FOR循环语句。 动态语句使用原则: 联机系统的交易程序不宜使用动态SQL。 PL/pgSQL中要实现DDL语句和系统控制命令,可使用动态SQL。 尽量使用变量绑定。 拼装SQL的使用原则: 拼装SQL宜使用绑定变量。 拼装SQL语句的条件如果有外部输入源,应对输入条件进行字符检查,防止攻击。 在PL/pgSQL脚本中,单行代码的长度,不宜超过2499字符。 Trigger使用原则: Trigger可用于实现差量数据日志等与业务处理无关的可用性设计场景。 不应使用Trigger实现业务处理相关功能。
-
总体开发原则 应完全按照设计文档进行开发。 程序模块应做到高内聚低耦合。 应有正确、全面的故障对策。 程序编写应做到结构合理,条理清晰。 程序名称命名应按照统一的命名规则进行命名。 应充分考虑程序的运行效率,包括程序的执行效率和数据库的查询、存储效率,在保证应用的同时应使用效率高的处理方法。 程序注释应详细、正确、规范。 除非应用特别需要控制COMMIT和ROLLBACK的提交时机,否则应在存储过程结束时执行显式的COMMIT或者ROLLBACK操作。 程序处理应支持7*24小时;对于程序中断,应用程序应提供安全、简单的断点再续处理。 应提供标准、简单的应用输出,为应用维护人员提供明确的进度显示、错误描述和运行结果;为业务人员提供明确、直观的报表、凭证输出。
-
异常处理原则 任何在PL/pgSQL函数中发生的错误都会中止该函数的执行,实际上还会中止其周围的事务。可以使用带有EXCEPTION子句的BEGIN块捕获错误并且从中恢复。 在使用PL/pgSQL块中,如果使用了不能返回确定结果的SQL语句,应在EXCEPTION子句中对程序可能出现的异常进行处理,避免出现未处理的异常被传递到外层块,导致程序逻辑错误。 对于系统已经定义的异常,可以直接使用。DWS暂不支持自定义异常。 进入和退出一个包含EXCEPTION子句的块要比不包含EXCEPTION子句的块开销大的多。因此,非必要场景不使用EXCEPTION。
-
书写规范 变量命名规则: 过程、函数的输入参数格式宜为:IN_参数名,参数名宜使用大写。 过程、函数的输出参数格式宜为:OUT_参数名,参数名宜使用大写。 过程、函数的输入输出参数格式宜为:IO_参数名,参数名宜使用大写。 过程、函数的程序中用到的变量宜由v_变量名组成,变量名宜使用小写。 将查询语句做成字符串拼接时,where语句的拼接变量名宜统一为v_where,select语句的拼接变量名宜为v_select。 记录(RECORD)的类型(TYPE)命名宜由T+变量名组成,名称宜使用大写。 游标命名宜由CUR+变量名组成,名称宜使用大写。 引用游标(REF CURSOR)的命名宜由REF+变量名组成,名称宜使用大写。 变量类型定义: 变量类型声明时,如果其含义和应用表某字段含义相同时,应使用%TYPE声明。 记录类型声明时,如果其含义和某应用表行数据相同时,应使用%ROWTYPE声明。 注释规范: 注释应该是有意义的,而不只是重述代码。 注释应简洁、易懂,以中文为主。为了表达准确,名词或操作上也可以使用英文。 应在每个存储过程、函数的开始加入注释,注释内容应包括:本程序的简要功能描述、编写者、编写日期、程序版本号信息和程序变更信息,同时各存储过程开头注释应保持统一格式。 应在输入输出参数的旁边添加注释,注明变量的意义。 应在每个块或大分支的开始添加注释,描述块的简要功能,若使用算法,应添加注释简单描述算法的目的和结果。 变量声明格式: 每行应只包含一条语句,如同时需要赋初始值,应在同一行书写。 大小写规范: 除了变量名,应一律使用大写。 缩进规范: 创建存储过程语句中,同一层的CREATE、AS/IS、BEGIN、END这几个关键字应位于同一列,其他部分依次缩进。 语句详述: 变量定义语句。每行应只包含一条语句。 同一层的IF、ELSEIF、ELSE和END关键字应开始于同一列,执行语句缩进。 CASE和END关键字应位于同一列,WHEN和ELSE关键字应缩进。 同一层的LOOP和END LOOP关键字应位于同一列,层内语句或嵌套应依次缩进。
更多精彩内容
CDN加速
GaussDB
文字转换成语音
免费的服务器
如何创建网站
域名网站购买
私有云桌面
云主机哪个好
域名怎么备案
手机云电脑
SSL证书申请
云点播服务器
免费OCR是什么
电脑云桌面
域名备案怎么弄
语音转文字
文字图片识别
云桌面是什么
网址安全检测
网站建设搭建
国外CDN加速
SSL免费证书申请
短信批量发送
图片OCR识别
云数据库MySQL
个人域名购买
录音转文字
扫描图片识别文字
OCR图片识别
行驶证识别
虚拟电话号码
电话呼叫中心软件
怎么制作一个网站
Email注册网站
华为VNC
图像文字识别
企业网站制作
个人网站搭建
华为云计算
免费租用云托管
云桌面云服务器
ocr文字识别免费版
HTTPS证书申请
图片文字识别转换
国外域名注册商
使用免费虚拟主机
云电脑主机多少钱
鲲鹏云手机
短信验证码平台
OCR图片文字识别
SSL证书是什么
申请企业邮箱步骤
免费的企业用邮箱
云免流搭建教程
域名价格