蓝枫的个人空间

暂无签名

  • 博客访问: 179381
  • 博文数量: 87
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-05 17:48
个人简介

暂无介绍

ITPUB论坛APP

ITPUB论坛APP



APP发帖 享双倍积分

文章分类

全部博文(87)

文章存档

2011年(1)

2010年(58)

2009年(17)

2008年(11)

我的朋友
微信关注

IT168企业级官微



微信号:IT168qiye



系统架构师大会



微信号:SACC2013

订阅
热词专题
database link 关闭session问题 2010-04-07 14:34:18

分类: Linux

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 ;

 

 

有关dblink的基础问题参照:http://www.dbabeta.com/2008/oracle_database_link_basics.html#more-13

阅读(12288) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

taoyoyo2015-07-19 00:38:20

我们正遇到这样的问题,
按照文中的样子,我建了个存储过程如下:

create or replace procedure cmdba."hs03cls" is


begin

   commit;

   execute immediate 'alter session close database link hs03';

end cmdba.hs03cls;

但编译的时候总提示错误如下:
PLS-00201:必须声明标识符'HS03'
PL/SQL:Statement ignored

水平实在有限,能指点一个下么!
谢谢了!

小被子00002010-10-27 10:47:42

我正好遇到这个问题,也是dblink的目标端session泛滥,导致目标端系统内存耗尽。都是通过dblink的查询。谢谢你的文档。

评论热议
请登录后评论。

登录 注册