Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解决java.sql.SQLException分布式事务等待锁定_Java_Oracle_Oracle11g_Transactions - Fatal编程技术网

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

如何解决java.sql.SQLException分布式事务等待锁定,java,oracle,oracle11g,transactions,Java,Oracle,Oracle11g,Transactions,我们正在使用Oracle11g和JDK1.8的组合。 在我们的应用程序中,我们使用XAConnection,XAResource进行DB事务。 分布式事务 在少数情况下,我们需要终止Java进程来停止应用程序。 终止后,如果重新启动应用程序,则在执行DB事务时会出现以下异常 java.sql.SQLException: ORA-02049: timeout: distributed transaction waiting for lock 在此之后的几个小时内,我们无法使用我们的应用程序,直到

我们正在使用Oracle11g和JDK1.8的组合。 在我们的应用程序中,我们使用XAConnection,XAResource进行DB事务。 分布式事务

在少数情况下,我们需要终止Java进程来停止应用程序。 终止后,如果重新启动应用程序,则在执行DB事务时会出现以下异常

java.sql.SQLException: ORA-02049: timeout: distributed transaction
waiting for lock
在此之后的几个小时内,我们无法使用我们的应用程序,直到锁释放

有人能给我提供一些解决方案,让我们可以继续工作,而不是等待锁释放

我尝试了以下选项:

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


我处理的数据量非常小。

我遵循了一个与之类似的主题

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

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

其他可能性如下所示:

一种可能的方法是将分布式锁定超时的INIT.ORA参数增加到更大的值。这将给您更长的时间来观察v$lock表,因为锁会持续更长的时间。 要实现自动化,您可以 -每隔5-10秒运行一次SQL作业,将v$lock的值或sandos在上面给出的查询记录到一个表中,然后对其进行分析,查看是哪个会话导致了锁。 -运行STATSPACK或AWR报告。锁定的会话应该显示为经过很长时间,因此可以识别。 v$session还有3列blocking\u instance、blocking\u session、blocking\u session\u status,可以将这些列添加到上面的查询中,以提供锁定内容的图片


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

你是如何用
立即
选项终止会话的?扼杀Java进程似乎是一种严厉的做法。你不能添加一个机制来触发一个干净的退出;或者应用程序处于不会响应的状态?对于挂起的分布式事务,dba_2pc_pending中是否有一行可以提交或回滚?@justin Cave dba_2pc_pending中没有可用的行