我们正在使用Oracle 11G和JDK1.8组合。 在我们的应用程序中,我们使用XAConnection,XAResource进行数据库事务。 即)分布式交易。
在某些情况下,我们需要杀死我们的Java进程来停止应用程序。 在查杀之后,如果我们重启我们的应用程序,那么我们在进行数据库事务时会得到以下异常。
java.sql.SQLException: ORA-02049: timeout: distributed transaction
waiting for lock
在这几个小时之后,我们无法使用我们的应用程序直到锁定释放。
有人可以为我提供一些解决方案,以便我们可以继续工作,而不是等待锁定释放。
我尝试过以下选项:
a)使用alter命令获取SID并终止会话。此后也不释放表锁。
我正在处理非常少量的数据。
答案 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可以添加到上面的查询中,以显示被锁定的内容。
我希望我帮助过你,我的朋友。