Oracle dblink造成远程数据库session过多

2015-07-16 12:07:54 · 作者: · 浏览: 1

现场报网公司数据库连不上,先检查了下数据库processes=1500,session=2200.我觉得很大啊,这个数据库没有几个人用。


查看v$session中的session最多是哪个machine发起的,发现是省公司的数据库发起的session,找开发梳理了下业务,省公司同步dblink操作网公司表,且是通过weblogic的连接池。


哦,有点明白了,是dblink引起的,weblogic连接池是一直存在的,所以在网公司端session是不释放的,如果省公司把应用都停掉,那在网公司端的session都会释放。要验证想法,做个试验:


目标:数据库A上建dblink,修改数据库B上的表。


环境准备:


1.在数据库A上建dblink


create public database link TO_B


connect to TEST_DB identified by? TEST_DB


using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.15.150)(PORT = 1521)))(CONNECT_DATA =(SID = orcl)))';


2.在数据库B上建表


create table TEST(? ID NUMBER );


insert into test values(1);


开始测试:


1.在数据库B上select count(1) from v$session;


2.在数据库A上update test@TO_B set id=1;


commit;


3.在数据库B上select count(1) from v$session; 可以看到涨了一个


对比测试:


1.在数据库B上select count(1) from v$session;


2.在数据库A上update test@TO_B set id=1;


commit;


alter session close database link TO_B;


3.在数据库B上select count(1) from v$session; 可以看到没有变化


总结: 出现这种问题,归根结底是操作dblink不规范,用了之后没有关闭。


附录为官方文档:


?


If you access a database link in a session, then the link remains open until you close the session. A link is open in the sense that a process is active on each of the remote databases accessed through the link. This situation has the following consequences:


After you close a session, the links that were active in the session are automatically closed. You may have occasion to close the link manually. For example, close links when:


To close a link, issue the following statement, where?linkname?refers to the name of the link:


Note that this statement only closes the links that are active in your current session.?