如何解决java.sql.SQLException等待锁定的分布式事务

时间:2016-08-25 18:01:06

标签: java oracle oracle11g transactions

我们正在使用Oracle 11G和JDK1.8组合。 在我们的应用程序中,我们使用XAConnection,XAResource进行数据库事务。 即)分布式交易。

在某些情况下,我们需要杀死我们的Java进程来停止应用程序。 在查杀之后,如果我们重启我们的应用程序,那么我们在进行数据库事务时会得到以下异常。

java.sql.SQLException: ORA-02049: timeout: distributed transaction
waiting for lock

在这几个小时之后,我们无法使用我们的应用程序直到锁定释放。

有人可以为我提供一些解决方案,以便我们可以继续工作,而不是等待锁定释放。

我尝试过以下选项:

a)使用alter命令获取SID并终止会话。此后也不释放表锁。

我正在处理非常少量的数据。

1 个答案:

答案 0 :(得分:0)

我跟着一个与tips about what to do with distributed connections类似的主题。

  

在您结束本地会话或会话的数据库链接数超过OPEN_LINKS的值之前,Oracle连接将保持打开状态。要减少与保持数据库链接打开相关的网络开销,如果您不打算在会话中再次使用它,请使用此子句显式关闭链接。

我相信,通过在DDL执行后关闭你的连接和会话,不应该发生这个问题。

this question上提供了其他可能性:

  

一种可能的方法是将distributed_lock_timeout的INIT.ORA参数增加到更大的值。这将使您有更长的时间来观察v $ lock表,因为锁会持续更长时间。   要实现这一目标的自动化,您可以    - 每5-10秒运行一次SQL作业,将v $ lock的值或sandos上面给出的查询记录到表中,然后分析它以查看导致锁定的会话。    - 运行STATSPACK或AWR报告。被锁定的会话应该显示出很长的时间,因此可以被识别。   v $ session还有3列blocking_instance,blocking_session,blocking_session_statust可以添加到上面的查询中,以显示被锁定的内容。

我希望我帮助过你,我的朋友。