oracle 程序中的 dbms_session.close_database_link

And*_*rew 1 oracle session stored-procedures dblink

我有许多过程使用相同的数据库链接,并且该过程可以在不同时间执行,或者某些过程同时运行,具体取决于调度程序作业。该过程用于从远程数据库获取数据并将数据插入到本地数据库中。因为我不想在执行每个过程后保持数据库连接打开,因为它会在数据库连接上产生负载,这可能会影响查询成本和查询执行时间。这就是为什么我使用 dbms_session 在每个过程结束时关闭数据库链接。 DBMS_SESSION.CLOSE_DATABASE_LINK 但我不知道在获取同时执行的某些过程的数据时这是否会导致任何问题。当 dbms 会话关闭某些过程的数据库链接连接时,同时如果任何过程尝试访问数据库链接,它可能无法获取数据或导致任何错误。使用时会出现这种情况吗 DBMS_SESSION.CLOSE_DATABASE_LINK

Moh*_*uny 5

以下是关闭链接的方法:

A. 只有打开数据库链接的会话才能将其关闭。会话关闭时数据库链接也会关闭... select * from dba_DB_LINKS将显示已创建的数据库链接 V$DBLINK 将列出会话中所有打开/活动的数据库链接,..

要了解 dblink 已打开多长时间,请运行:

    select t.addr, s.sid, s.username, s.machine, s.status,
      (sysdate - to_date(t.start_time, 'MM/DD/YY HH24:MI:SS')) * 24 as hours_active
    from v$transaction t, v$session s
    where t.addr = s.taddr;
Run Code Online (Sandbox Code Playgroud)

如何知道事务是本地事务还是分布式事务?

检查 v$global_transaction

B. 使用 ALTER SESSION 或显式使用命令:

   alter session close database link <name>; 
Run Code Online (Sandbox Code Playgroud)

或使用以下包:

    dbms_session.close_database_link(<name>);
Run Code Online (Sandbox Code Playgroud)

C. 还可以对连接dblink的用户设置idle_time限制。在 dblink 的服务器端(dblink 的目标)问题:

    create profile pidle limit idle_time 5; -- 5 minutes 
    alter user test profile pidle; -- user under which connects dblink 
    alter system set resource_limit=true; -- must be set to work idle_time limit 
    (or add resource_limit=true to init.ora or both)
Run Code Online (Sandbox Code Playgroud)