快速业务通道

Hibernate程序使用WAS连接池提交事务时出现NullPointerExceptio - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

Hibernate程序使用WAS连接池提交事务时出现NullPointerExceptio

时间:2010-12-31 隔叶黄莺

Hibernate应用程序部署到WebSphere Application Server 5.1上,使用WAS的连接池,程序在处理了比较多的 session.save(object)操作之后,在执行提交事物 trans.commit()之时出现以下异常

java.lang.NullPointerException at oracle.jdbc.dbaccess.DBData.clearItem(DBData.java:431) at oracle.jdbc.dbaccess.DBDataSetImpl.clearItem(DBDataSetImpl.java:3528) at oracle.jdbc.driver.OraclePreparedStatement.clearParameters(OraclePreparedStatement.java:3401) at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.resetStatement(WSJdbcConnection.java:1719) at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.prepareStatement(WSJdbcConnection.java:1415) at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.prepareStatement(WSJdbcConnection.java:1381) at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:497) at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:94) at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:87) at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:218) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2220) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2656) at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:52) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:28) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338) at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)

因为开发用的是Tomcat应用服务器,配置的Tomcat连接池,所以在本地跑怎么操作都不会有这种错误,费了好一翻工夫也没能定位,查错中总是受 java.lang.NullPointerException 的影响,一遍一遍地审视代码,会是哪个变量没有初始化呢?

自我折磨了好一阵子,无奈之时去网上Google一把(其实早该这么做的,也就因为怀疑问题出在自己写的代码),才发现原来别人也遇到过类似的问题, Hibernate的官方论坛也有这种讨论.

http://www.google.cn/search?complete=1&hl=zh-CN&newwindow=1&q=+oracle.jdbc.dbaccess.DBDataSetImpl.clearItem&meta=

网上有说是驱动的问题,有说是Hibernate数据库方言的问题,也有说最大缓存语句的问题

1. Delete Object error http://forum.hibernate.org/viewtopic.php?t=934050

其中提到的有换 Oracle 数据库驱动, 有人试着换成 ojdcbc14.jar 解决,最后有人说到设置 c3p0 的hibernate.c3p0.max_statements 为 0 就行

2. NullPointerException on transaction.commit() http://forum.hibernate.org/viewtopic.php?t=973414&sid=04bbd1a8951b3051c52e374a7888d35e

回贴中说是把 org.hibernate.dialect.OracleDialect 换成 org.hibernate.dialect.Oracle9Dialect, 但有人采取这种做法无效,何况我用的还是 8.0.5 的Oracle,I 都不带.

3. WAS 6上DataSource的问题 http://www.itpub.net/743938.html

这篇贴主就直接撇名了把Data Source的Command Cache只能设为0,一旦大于0就报以上错误,看来这是一个比较明确的解决办法。于是我就在WAS的控制台下把我所用连接池的 语句高速缓存大小 设置为 0 ,然后重启WAS,问题得到解决。就是不知道不缓存 Statement 对性能会产生怎么样的影响,须进一步了解一下。

我也试过换数据库驱动的办法,把原有的驱动换成在我本地可用的class12.jar包,没有效果。又换成ojdbc.jar包试试,还是没用。

总结出现以上错误的解决办法,设置WAS的数据源属性的 Command Cache(也就是语句高速缓存大小)为0, 如果用的别的连接池产品,要设置相应的 max_statements 为 0,属性名具体参考对应连接池产品。

注意,改了WAS的数据源设置需要重启WAS的。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号