db2 jdbc 驱动程序不释放表锁
Posted
技术标签:
【中文标题】db2 jdbc 驱动程序不释放表锁【英文标题】:db2 jdbc driver does not release table locks 【发布时间】:2010-03-19 10:29:23 【问题描述】:情况:我们有一个运行在 tomcat 上的 Web 服务访问 AS400 上的 DB2 数据库,我们使用 JTOPEN 驱动程序来处理由 tomcat 处理的 JNDI 连接。为了处理事务和访问数据库,我们使用 Spring。
对于每个 select 系统从 JNDI(即来自连接池)获取 JDBC 连接,进行选择,最后它关闭 ResultSet、Statement 并按此顺序释放 Connection。这很好,表上的共享锁消失了。
当我们想以与 select 相同的方式进行更新时(ResultSet 对象上的异常,在这种情况下我们没有),在释放 Connection to JNDI lock on table 之后。
如果我们在 JNDI 配置中将 maxIdle=0 设置为连接数,这个问题就会消失,但这会降低性能,我们在该服务上有 cca 100 个在线用户,我们需要很少的连接才能在池中存活。
你有什么建议?
【问题讨论】:
这个问题好像和db2有关,其实是一个特性:archive.midrange.com/java400-l/201003/msg00028.html 【参考方案1】:听起来好像默认情况下禁用了自动提交,并且代码没有在任何地方调用connection.commit()
。要解决此问题,请配置连接池使其仅返回与 autoCommit = true
的连接,或更改它在执行 SQL 操作的 try
块末尾提交事务的 JDBC 代码。
【讨论】:
当然我们做了 commit()-ed 我们的交易。我们得出的结论是,如果我们在同一张表上组合了两个事务;一次更新和一次选择,都是合法的 commit()-ed,只有在那种情况下,我们才能锁定表。【参考方案2】:看看this。
它在同样的情况下帮助了我。
【讨论】:
也许您可以描述确切的帮助并保留链接以供参考。看看How to Answer。以上是关于db2 jdbc 驱动程序不释放表锁的主要内容,如果未能解决你的问题,请参考以下文章