Multithreading JDBC提交失败,当autocommit=true时调用提交。多线程hibernate会话以某种方式更改自动提交?
我有一个生成线程2的主线程,它在主线程中使用相同的hibernate会话。线程2只是每隔几分钟选择一次select 1,以保持db连接的活动状态,因为主线程有一个长时间运行的进程。一旦主线程完成处理,它将调用提交,但我得到错误:Multithreading JDBC提交失败,当autocommit=true时调用提交。多线程hibernate会话以某种方式更改自动提交?,multithreading,hibernate,spring,session,autocommit,Multithreading,Hibernate,Spring,Session,Autocommit,我有一个生成线程2的主线程,它在主线程中使用相同的hibernate会话。线程2只是每隔几分钟选择一次select 1,以保持db连接的活动状态,因为主线程有一个长时间运行的进程。一旦主线程完成处理,它将调用提交,但我得到错误: Caused by: org.hibernate.TransactionException: JDBC commit failed at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransacti
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
在主线程中,它创建成功提交的内部事务,只有提交时抛出此错误的外部事务。我看不出什么会改变自动提交布尔值。在我引入第二个线程来保持连接活动之前,这个错误从未发生过。尽管我认为您应该认真重新考虑使用Hibernate的方式,但是您可以通过在JDBC驱动程序的URL中添加一个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
来源:在a中找到答案,解决方案引用:
在JDBCURL中设置属性relaxAutoCommit=true,我们解决了问题
当然,博客是在另一个场景中,只需跳过rewriteBatchedStatements=true部分您是否同时使用来自多个线程的单个连接?是的,这是正确的。线程1创建打开db连接的会话,线程2使用相同的会话和连接。线程1将在该连接中创建新事务以执行更新,而线程2仅从DB中选择1以保持连接活动。
jdbc:mysql://dbserver/database?rewriteBatchedStatements=true&relaxAutoCommit=true