如何使用XA数据源和事务关闭JDBC中的Oracle数据库链接以避免ORA-0202错误?

如何使用XA数据源和事务关闭JDBC中的Oracle数据库链接以避免ORA-0202错误?,oracle,jdbc,dblink,Oracle,Jdbc,Dblink,我有一个基于JDBC的应用程序,它使用XA数据源和跨多个连接的事务,连接到Oracle数据库。该应用程序有时需要使用join从另一台(Oracle)服务器使用共享数据库链接进行一些查询。如果我不经常这样做,请求就会起作用,但是在连续4到5次请求之后,我会收到一个错误(ORA-0202-使用的链接太多)。我做了一些研究,建议的补救办法是调用“ALTERSESSION CLOSE数据库链接”。如果在加入DbLnk表的查询之后调用此请求,则会得到错误ORA-2080(链接正在使用)。如果我在查询之前调

我有一个基于JDBC的应用程序,它使用XA数据源和跨多个连接的事务,连接到Oracle数据库。该应用程序有时需要使用join从另一台(Oracle)服务器使用共享数据库链接进行一些查询。如果我不经常这样做,请求就会起作用,但是在连续4到5次请求之后,我会收到一个错误(ORA-0202-使用的链接太多)。我做了一些研究,建议的补救办法是调用“ALTERSESSION CLOSE数据库链接”。如果在加入DbLnk表的查询之后调用此请求,则会得到错误ORA-2080(链接正在使用)。如果我在查询之前调用它,我会得到ORA-2081(链接关闭)。这个电话有什么好处吗?JDBC连接在事务提交之前很久就关闭了(根据具体情况,事务提交由servlet或EJB容器管理)。我的印象是,当连接关闭时,Oracle会将链接标记为已关闭,但它需要一两分钟才能返回可用链接池。我知道我可以扩大链接池(使用配置文件中的open_links属性),但这不能保证在更重的负载下不会出现同样的问题。是否有其他方法可以让dblinks更快地关闭

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

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

编辑:

你在评论中描述的情况不应该发生。我对您的系统了解不够,无法了解事务的实际情况。无论如何,如果您无法准确了解系统正在执行的操作,您可以使用以下过程替换“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];

谢谢你的回复。这是我担心会得到的回应。这很痛苦,因为处理SQL生成的层与处理事务的层相去甚远,但也许我可以找到一种不太难看的方法,将关闭请求传递到队列中,以便在提交或回滚后进行处理(至少在不是容器管理事务的情况下)。后续问题:如果问题是Oracle在事务关闭之前无法关闭链接,为什么在请求失败之前关闭链接的调用也会失败?它不在同一笔交易中。显然,如果以前没有使用链接,它应该会失败,但是如果链接在事务A中使用,然后提交,一分钟后我尝试在新事务B中关闭链接,然后再次使用dblink,为什么会出现ORA-2081(链接已关闭)错误?FTI,我只是运行了一个测试,看看将关闭请求排队,并在提交后立即调用它是否可行,但实际上不行。我仍然得到ORA-02081错误。关于v_u$dblink的授权的提示很有用。现在,我可以在收到ORA-0202(打开的链接太多)错误后立即查询v$dblink。不幸的是,这张桌子完全是空的。这很奇怪。这就好像数据库链接从列表中删除了,但没有立即关闭。v$dblink只列出会话中打开的数据库链接。