JDBC提交失败,在autocommit = true时调用commit。多线程的hibernate会话以某种方式改变自动提交?

时间:2011-03-10 16:04:40

标签: multithreading hibernate spring session autocommit

我有主线程产生线程#2,它在主线程中使用相同的hibernate Session。线程#2每隔几分钟执行一次“选择1”以保持数据库连接处于活动状态,因为主线程的运行时间较长。一旦主线程完成w /处理,它调用提交但我得到错误:

Caused by: org.hibernate.TransactionException: JDBC commit failed
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:161)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:655)
    ... 5 more
Caused by: java.sql.SQLException: Can't call commit when autocommit=true
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:930)
    at com.mysql.jdbc.ConnectionImpl.commit(ConnectionImpl.java:1602)
    at org.hibernate.transaction.JDBCTransaction.commitAndResetAutoCommit(JDBCTransaction.java:170)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:146)
    ... 6 more

在主线程中,它创建成功提交的内部事务,它只是提交时引发此错误的外部事务。我没有看到什么可以改变自动提交布尔值。在我介绍第二个线程以保持连接活动之前,此错误从未发生过。

2 个答案:

答案 0 :(得分:6)

即使我认为您应该认真考虑使用Hibernate的方式,但可以通过在其URL中向JDBC驱动程序添加relaxAutoCommit参数来绕过此问题。

MySQL文档中的详细信息:

relaxAutoCommit

If the version of MySQL the driver connects to does not support transactions, still allow calls to commit(), rollback() and setAutoCommit() (true/false, defaults to 'false')?

Default: false

Since version: 2.0.13

来源:https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration-properties.html

答案 1 :(得分:3)

blog找到答案,解决方案引用:

  

在jdbc url中设置属性relaxAutoCommit = true我们解决了我们的问题。

jdbc:mysql://dbserver/database?rewriteBatchedStatements=true&relaxAutoCommit=true

当然博客在另一个场景中,只需跳过" rewriteBatchedStatements = true"部分