gpt4 book ai didi

oracle - 如何使用 XA 数据源和事务关闭 JDBC 中的 Oracle DbLinks 以避免 ORA-02020 错误?

转载 作者:行者123 更新时间:2023-12-01 04:12:51 24 4
gpt4 key购买 nike

我有一个基于 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 属性),但这并不能保证在更重的负载下我不会遇到同样的问题。有什么我可以做的不同的事情来让 dblinks 更快地关闭吗?

最佳答案

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

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

编辑:

您在评论中描述的情况不应该发生。我对您的系统了解不够,无法了解交易的真正情况。无论如何,如果你不能确切地弄清楚系统在做什么,也许你可以用这样的过程替换“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];

关于oracle - 如何使用 XA 数据源和事务关闭 JDBC 中的 Oracle DbLinks 以避免 ORA-02020 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5088934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com