Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading JDBC提交失败,当autocommit=true时调用提交。多线程hibernate会话以某种方式更改自动提交?_Multithreading_Hibernate_Spring_Session_Autocommit - Fatal编程技术网

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

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

我有一个生成线程2的主线程,它在主线程中使用相同的hibernate会话。线程2只是每隔几分钟选择一次select 1,以保持db连接的活动状态,因为主线程有一个长时间运行的进程。一旦主线程完成处理,它将调用提交,但我得到错误:

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