我有一个基于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更快地关闭吗?
任何分布式SQL,即使是选择的SQL,都会打开必须关闭的事务,然后才能关闭数据库链接。在调用ALTER SESSION CLOSE DATABASE LINK之前,您需要回滚或提交。
但是听起来您已经有了其他东西来处理您的交易。如果无法手动回滚或提交,则应尝试增加打开链接的数量。 OPEN_LINKS参数是每个会话的最大链接数。您需要的链接数量实际上并不取决于负载,它应该基于不同的远程数据库的最大数量。
编辑:
您在评论中描述的情况不应该发生。我对您的系统了解不足,无法了解交易的实际情况。无论如何,如果您无法确切地了解系统在做什么,则可以使用以下过程替换“更改会话关闭数据库链接”:
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也会保持与远程数据库的DBLink连接打开。因此,下次在内部创建新的数据库链接连接。
[有一些建议通过更改会话等来关闭连接check this out
但是,如果您是从Java应用程序进行连接,则不确定如何进行。