2014-12-31 4 views
1

Я пытаюсь обновить нашу базу кода от Hibernate 3.6 до 4.0 (как первый шаг к тому, чтобы получить нас более актуальными). Я сталкиваюсь с проблемой, когда COMMIT не выдается, даже если мы вызываем commit(), после того, как транзакция isActive().Обновление Hibernate 4, COMMIT не выпущен

При выполнении некоторых запросов успешно к базе данных Postgres, я вижу это в журналах Postgres:

2014-12-30 20:09:39 CST LOG: execute <unnamed>: SET extra_float_digits=3 
2014-12-30 20:09:39 CST LOG: execute S_1: BEGIN 
2014-12-30 20:09:39 CST LOG: execute <unnamed>: -- This script........ 

Обратите внимание на НАЧАТЬ там, а потом вот пример простого совершения звонка:

if (sf.getCurrentSession().getTransaction().isActive()) { 
     sf.getCurrentSession().getTransaction().commit(); 
    } 

Я отлаживал в AbstractTransactionImpl и смотрю на метод commit() Jdbc4Connection и вижу, что фактический вызов COMMIT пропускается ..... но я не знаю почему. Вот инструкция if, в которой это происходит (это в AbstractJdbc2Connection).

if (protoConnection.getTransactionState() != ProtocolConnection.TRANSACTION_IDLE) 
    executeTransactionCommand(commitQuery); 

Таким образом, очевидно, что наше транзакционное состояние == ProtocolConnection.TRANSACTION_IDLE. Однако я не совсем уверен, что это значит, и почему мы получаем эту проблему, когда транзакция говорит, что это isActive()?

ПРИМЕЧАНИЕ: этот точный точный код работал для нас на Hibernate 3.6.

Спасибо.

UPDATE: Я отлажена дальше, и, похоже, есть много объектов, ProtocoalConnectionImpl строящиеся, значит ли это указывает на проблему на нашей программной стороне, что делает что-то он не должен? Как это указывает на то, что мы открываем соединения, которые просто висят вокруг? Спасибо за более глубокое понимание.

ответ

0

Так получилось, что я делал что-то неправильное (сюрприз). Существует веская причина, что TransactionState показывал как TRANSACTION_IDLE и не выдавал фиксацию.

Я видел в нескольких местах в Интернете, где люди получали доступ к соединению JDBC на новой земле Hibernate 4.x, получая доступ к базовому ConnectionProvider (вроде как: https://stackoverflow.com/a/21271019/115694).

Однако проблема с этим заключается в том, что вы получаете соединение BRAND NEW .... вместо соединения, связанного с текущим сеансом . Это довольно большой нет-нет, или, по крайней мере, для нас это было.

Вы должны фактически делать то, что говорит человек в этом ответе: https://stackoverflow.com/a/3526626/115694

В принципе, вы должны использовать Work API.

Смежные вопросы