database link 關閉session問題

hexiaomail發表於2010-04-07

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9932141/viewspace-631509/,如需轉載,請註明出處,否則將追究法律責任。

相關文章