Не удалось зафиксировать JDBC, вызывая коммит, когда autocommit = true.Многопоточный сеанс гибернации как-то меняет автокоммит? - PullRequest
8 голосов
/ 10 марта 2011

У меня есть основной поток, который порождает поток # 2, который использует тот же сеанс гибернации в основном потоке.Поток № 2 просто «выбирает 1» каждые несколько минут, чтобы поддерживать соединение с БД из-за длительного процесса в основном потоке.Как только основной поток завершается с обработкой, он вызывает коммит, но я получаю ошибку:

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-й поток, чтобы поддерживать соединение живым, эта ошибка никогда не возникала.

Ответы [ 2 ]

6 голосов
/ 10 марта 2011

Хотя я думаю, что вам следует серьезно пересмотреть способ использования Hibernate, вы можете обойти эту проблему, добавив параметр relaxAutoCommit в драйвер JDBC в его URL-адресе.

Подробности из документации 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

3 голосов
/ 15 апреля 2014

нашел ответ в блоге , решение цитирует:

Установив атрибут relaxAutoCommit = true в URL-адресе jdbc, мы решили нашу проблему.

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

Конечно, блог находится в другом сценарии, просто пропустите часть "rewriteBatchedStatements = true"

...