Hibernate 4 обновление, COMMIT не выпускается

1

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

При успешном запуске некоторых запросов в базе данных 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........

Обратите внимание на BEGIN, а затем здесь пример простого вызова фиксации:

    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, что указывает на проблему со стороны нашего программного обеспечения, которая делает что-то не так? Как это указывает на то, что мы открываем соединения, которые просто висят вокруг? Спасибо за более глубокое понимание.

Теги:
hibernate
jdbc
postgresql-9.1

1 ответ

0
Лучший ответ

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

Я видел в нескольких местах в Интернете, где люди получали доступ к соединению JDBC на новой земле Hibernate 4.x, получая доступ к базовому ConnectionProvider (вроде этого: qaru.site/questions/83574/...).

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

Вы действительно должны делать то, что человек говорит в этом ответе: qaru.site/questions/83574/...

В принципе, вы ДОЛЖНЫ использовать API работы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню