存储过程中经常有使用dblink的场景,本文探讨下dblink连接关闭的问题。
第一种方法,调用oracle存储过程
如果通过dblink和同义词访问目标表时,会在目标表的数据库产生新的session,新的session会占用一定的内存空间,而且tcp连接一直占用着,虽然下次会复用连接,但是连接被占用很耗资源,建议手动关闭(oracle会关,但是不靠谱。。。)。
为什么要手动关,必须在一个事务里面才能关,管理员都难关(大神不在考虑范围内)。
使用关闭dbms_session.close_database_link(‘你的dblink名称’);dblink连接
我本地连接另外一个数据库,已测;
示例如下
create or replace package body test_pck is
PROCEDURE test_pro(xxx IN varchar2)IS
v_sql VARCHAR2(500);
BEGIN
v_sql := 'SELECT * FROM sys_org@TEST_LINK';
EXECUTE IMMEDIATE v_sql;
COMMIT;
dbms_session.close_database_link('TEST_LINK');
COMMIT;
END test_pro;
end test_pck;
第二种方法,alter session close database link…
alter session close database link ‘你的dblink名称’;
这样是和写到程序里面例如java,而且第一种适合存储过程使用,因为他是调用oracle本身固有的存储过程去做,直接写上就行,第二种需要定义sql执行sql。
示例如下
v_sql := 'alter session close database link TEST_LINK';
EXECUTE IMMEDIATE v_sql;
commit;
最后注意事项
建议把有dblink的同步写到一个存储过程里面,在最后关了,然后在exception里面也写一份关闭,这样就万无一失了;
程序员谨记,先测试,再上线。
谢谢!