database link 关闭session问题
db-link session在基于连接池的管理中可能会引起目标管理系统的Session泛滥,从而消耗进程资源。
最近出现一个关于db-link session的问题,在A数据库建立了一个DBLINK,其他有三台服务器利用DBLINK连接到A数据库,但是在应用中利用了连接池进行
session管理,当使用DBLINK时,在A数据库出现session快速增长,达到了顶峰从而导致进程资源消耗连接出现中断。
方式一:
使用命令
alter sesssion close database link ;
使用系统包
DBMS_SESSION.CLOSE_DATABASE_LINK(dblink_name);
此种方式需要用在应用程式当中,ORACLE文档说明,此方式只对当前session起作用,所以管理员SYS去关闭也是不成功的。
SQL> conn / as sysdba
Connected.
SQL> alter session close database link test;
ERROR:
ORA-02081: database link is not open
注意,在使用此方式的命令之前需要用commit命令首先提交,否则会出现ora-02080错误。
--eg:實現關閉dblink
declare
v varchar2(50);
CURSOR r IS
select first_name from t1@test;
begin
open r;
loop
fetch r
into v;
exit when r%NOTFOUND;
end loop;
close r;
commit;
execute immediate 'alter session close database link test';
end;
/
方式二:
SQLNET.ORA文件中的参数设定(针对PROFILE的建立,限制用户资源使用)
SQLNET.EXPIRE_TIME=
注:用此方式会导致用户的会话都受到影响,除非DBLINK是单独使用一个用户。
方式三:
用SELECT查询并形成命令
select sid,
serial#,
username,
osuser,
machine,
'alter system kill session ' || '''' || sid || ',' || serial# ||
''' immediate;' session_level
from v$session
where machine in ('DB01', 'DB02', 'DB03');
注意每个命令后面后加的immediate,没有加此关键字则v$session中的STATUS列会变为KILLED,但是资源并未释放。
利用方式三可以做成JOB定时kill session,但这样存在很大的风险。
总之,在使用DBLINK时一定要注意session的回收,在应用程序中使用
commit;
alter sesssion close database link ;
转自:http://blog.itpub.net/9932141/viewspace-631509