Java 更新DB2表超时

Java 更新DB2表超时,java,sql,db2,Java,Sql,Db2,我正在对DB2表进行如下更新(java代码): 很长一段时间后,我收到一个回滚和一条错误消息: 死锁或超时导致执行失败。原因代码00C9008E、资源类型00000302和资源名称SOME.THING.X“000002”。SQLCODE=-913,SQLSTATE=57033,DRIVER=3.57.82 表示此原因码表示这是一个超时。资源类型00000302是一个表空间页,我根本无法识别资源名称 当我单独运行SQL时,它工作正常: UPDATE MY.THREADS SET STATUS =

我正在对DB2表进行如下更新(java代码):

很长一段时间后,我收到一个回滚和一条错误消息:

死锁或超时导致执行失败。原因代码00C9008E、资源类型00000302和资源名称SOME.THING.X“000002”。SQLCODE=-913,SQLSTATE=57033,DRIVER=3.57.82

表示此原因码表示这是一个超时。资源类型00000302是一个表空间页,我根本无法识别资源名称

当我单独运行SQL时,它工作正常:

UPDATE MY.THREADS
SET STATUS = 1
WHERE ID = 156
我可以
选择
并查看状态是否已更新。(虽然当我在超时之前的长时间等待期间运行此SQL时,我也遇到了同样的问题。这需要花费很长时间,我只是取消了它)

事务中发生了一些事情,我没有看到此表或记录的任何其他更新。表上有创建/删除触发器,但没有更新触发器。我没有看到任何带有游标的选择,或者奇怪的隔离级别更改。我看不出交易中还有多少其他因素会导致这种情况

为什么我会出现这个错误?我还应该在交易中寻找什么?


编辑:
我从请求的开始到它被“卡住”的地方逐级检查了代码。似乎有两个DAO,它们都在创建一个事务。我认为这可能是问题所在。

因此SQL连接将超时,您需要在执行查询之前指定要“测试”连接的连接,以便在连接尚未打开时可以重新连接

我只有ApacheCommonsDBCP和池的代码,但下面是我使用自己的连接所做的。重要的行是
connectionPool.settstonbrow(true)
并指定验证查询
factory.setValidationQuery(“选择1”)


很抱歉回答我自己的问题,但我发现了问题所在。这是一个自制的框架,DAO在其中跟踪自己的连接

conn = getConn();
这将在显式事务中为每个DAO方法返回相同的连接

当我逐步浏览代码时,我发现我在事务中调用的一个方法正在创建一个新事务、一个新DAO,从而创建一个新的DB连接。现在我打开了两个事务和两个连接。在这一点上,很容易看出,我实际上是在使自己陷入僵局


这让我有点吃惊,因为我以前使用的应用程序允许嵌套事务。(对两个事务使用相同的DB连接)

我不认为连接超时,我认为是这条语句本身。它是一个活动连接,因为我将它用于事务中的其他select和update语句。如果是这种情况,那么此表上是否存在任何触发器或外键约束?
ID
定义为唯一索引和主键。表的其他列上有外键,但更新中仅涉及的字段不是
ID
STATUS
。谢谢你的建议。让他们来:-)对查询做一个描述。对于这么简单的事情,应该说受影响的行数是1
desc UPDATE threads\u table SET STATUS 1,其中ID=156
@Jess您确定没有人锁定记录吗?你自己打开了吗?看起来你试图更新的页面被另一个事务锁定了。您确定一次只有一个线程在执行此代码吗?看起来两个不同的事务正在尝试执行相同的更新。第二个失败了,但是第一个成功了,所以最后你看到表被更新了。那么你一定要接受你自己的答案!解决你自己的问题没有问题。
GenericObjectPool connectionPool = new GenericObjectPool(null);
...
connectionPool.setTestOnBorrow(true); // test the connection before its made
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI,username, password);

final String validationQuery = null;
KeyedObjectPoolFactory statementPool = new GenericKeyedObjectPoolFactory(null);
PoolableConnectionFactory factory = new PoolableConnectionFactory(connectionFactory, connectionPool,
        statementPool, validationQuery, defaultReadOnly, defaultAutoCommit);

factory.setValidationQuery("select 1");    // validate the connection with this statement
conn = getConn();