dbms_session.close_database_link 在 oracle 过程中

dbms_session.close_database_link in oracle procedures

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

以下是关闭 link 的方式:

一个。只有打开数据库 link 的会话才能关闭它.. 数据库 link 在会话关闭时关闭... select * from dba_DB_LINKS 将显示已创建数据库 link V$DBLINK 将列出您会话中的所有 open/active 数据库 link,..

要了解 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;

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

Check v$global_transaction

乙。使用 ALTER SESSION 或明确使用命令:

   alter session close database link <name>; 

或使用以下包:

    dbms_session.close_database_link(<name>);

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)