4

我有一个基于 JDBC 的应用程序,它使用 XA 数据源和跨越多个连接的事务,连接到 Oracle 数据库。该应用程序有时需要使用共享 DbLink 与来自另一个 (Oracle) 服务器的表进行连接来进行一些查询。如果我不经常执行该请求,则该请求有效,但在快速连续 4 或 5 个请求后,我收到错误(ORA-02020 - 使用的链接过多)。我做了一些研究,建议的补救措施是调用“ALTER SESSION CLOSE DATABASE LINK”。如果我在加入 DbLnk 表的查询之后调用此请求,则会收到错误 ORA-2080(链接正在使用中)。如果我在查询之前调用它,我会得到 ORA-2081(链接关闭)。这个电话有什么好处吗?JDBC 连接在事务提交之前很久就关闭了(由 servlet 或 EJB 容器管理,视情况而定)。我的印象是,当连接关闭时,Oracle 会将链接标记为已关闭,但它需要一两分钟才能返回到可用链接池。我知道我可以扩大链接池(使用配置文件中的 open_links 属性),但这并不能保证在较重的负载下我不会遇到同样的问题。我有什么不同的方法可以让 dblink 更快地关闭吗?

4

1 回答 1

2

任何分布式 SQL,甚至是一个选择,都会打开一个必须先关闭的事务,然后才能关闭数据库链接。在调用 ALTER SESSION CLOSE DATABASE LINK 之前,您需要回滚或提交。

但听起来你已经有了其他东西来处理你的交易。如果无法手动回滚或提交,则应尝试增加打开链接的数量。OPEN_LINKS参数是每个会话的最大链接数。您需要的链接数量实际上并不取决于负载,它应该基于不同远程数据库的最大数量。

编辑:

您在评论中描述的情况不应该发生。我对您的系统了解得不够多,无法了解交易的实际情况。无论如何,如果你不能确切地弄清楚系统在做什么,也许你可以用这样的过程替换“alter session close database link”:

create or replace procedure rollback_and_close_db_links authid current_user is
begin
    rollback;
    for links in (select db_link from v$dblink) loop
        execute immediate 'alter session close database link '||links.db_link;
    end loop;
end;
/

您可能需要此赠款:

grant select on v_$dblink to [relevant user];
于 2011-02-25T05:53:05.117 回答