Hibernate应用程序部署在WebSphere AS 上出现记录死锁的分析与解决

有一个项目,是用Hibernate开发的部署在WebSphere Application Server 5.1下,总是会出现数据库记录被死锁的情况,即使是一个简单的更新动作,都有可能造成。

这个问题,困扰我许久,检查过所有代码,事物一定要提交或者回滚,Session及时释放,怀疑过是否是因为是部署在集群环境,但好像那些措施总于事无补,百思不得其解。

就差没有使用容器提供的事物了。

突然间想到去各自的官网,查查有没有人碰到过类似的信息,于是在 http://www.hibernate.org 网站找到了Hibernate in WAS 5.x - fixes possible deadlock problem,其中提到要定制一个 ConnectionProvider,名之为 WSDataSourceConnectionProvider,代码如下:

以上代码中类 WSRRAFactory、JDBCConnectionSpec 用到了 $WAS_HOME/lib/rsaexternal.jar;类WSJdbcConnection、WSJdbcUtil 用到了 $WAS_HOME/lib/rsadapterspi.jar,所以需要在编译时 $WAS_HOME/lib 中两那两个包引用进来。

同时,在 hibernate.cfg.xml 中要有如下配置,记得在 WAS 还需配置相应的连接池 jdbc/unmiDs

文中又有链接提到 Sharing connections in WebSphere Application Server V5

大致说到的是,在WAS环境中Hibernate应用程序运行时可能一个事物使用的并非是同一个链接,无形中搞出个分布式事物来吧,具体情况和解决办法还有待细究,希望这个就是我想要的结果。

OK,明天再来分析上面那两篇文章吧,期望找到一个治本的解决方案。

好像与现今使用的C3P0连接池也有关系,有建议说换成最近新版的

文中 c3p0 problem 也有提到把 maxStatements 和 maxStatementsPerConnection 设置为零
c3p0.maxStatements=0
c3p0.maxStatementsPerConnection=0

本文链接 https://yanbin.blog/hibernate-was-dead-lock/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

1 Comment
Inline Feedbacks
View all comments
binge
16 years ago

关注