系统上线,急急急! Hibernate 非常奇怪的问题 org.hibernate.TransactionException: JDBC rollback failed
现象:
系统刚刚部署好的当天,访问几个系统没有问题,到了第二天访问该系统便会报错:org.hibernate.TransactionException: JDBC rollback failed,这个时候再重启tomcat一切又都好用了。也可以通过下面的方法测试,重新启动tomcat,一切好用,更改服务器的日期为第二天,结果几个系统就开始报错了。
网上的解决方法如下:
方法一:上网查了一下,有人说是数据库事务的原因,要把hibernate的autocommit设为false,我找了一下这个好像要在代码里面设置,而不能通过简单的设置Hibernate的配置文件来设置,就没有继续走这条路。后来想到可能是数据库连接池的原因。
方法二:在hibernate配置文件中加入对c3p0连接池的配置,同时将c3p0-0.8.4.5.jar拷贝到应用的lib文件夹下。这里说明一下,如果没有这个配置,hibernate默认使用其自身的数据库连接池。配置后则采用第三方的c3p0连接池。
使用c3p0连接池后确实没有问题了,但是我还是不明白为什么使用默认的连接池会有问题,如果哪位大哥清楚麻烦回复一下啊,谢谢!
代码如下:
public boolean login(String userName, String password) throws Exception {
Session session = HibernateUtil.currentSession();
Transaction tx = null;
ArrayList userslist = null;
//String isActiva=null;
try {
tx = session.beginTransaction();
Query query = session.createQuery(
"from SysUser as user where user.userName=:userName and user.userPassword=:userPassword and user.isActivation=1");
query.setString("userName", userName);
query.setString("userPassword", password);
userslist = (ArrayList) query.list();
tx.commit();
} catch (Exception e) {
if (tx != null) {
//tx.rollback();
}
throw e;
} finally {
tx = null;
HibernateUtil.closeSession();
}
if (userslist == null || userslist.size() == 0) {
return false;
} else {
return true;
}
}
请问高手,有没有更好的方法,以上解决的方法有效吗?现在系统上线,急急急!