Я пытаюсь обновить нашу базу кода с 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, что указывает на проблему со стороны нашего программного обеспечения, которая делает что-то не так? Как это указывает на то, что мы открываем соединения, которые просто висят вокруг? Спасибо за более глубокое понимание.
Так что получается, что я делал что-то неправильное (сюрприз). Там хорошая причина, что TransactionState показывал как TRANSACTION_IDLE и не выдавал фиксацию.
Я видел в нескольких местах в Интернете, где люди получали доступ к соединению JDBC на новой земле Hibernate 4.x, получая доступ к базовому ConnectionProvider (вроде этого: qaru.site/questions/83574/...).
Однако проблема с этим заключается в том, что вы получаете соединение BRAND NEW... вместо соединения, связанного с текущим сеансом. Это довольно большой нет-нет, или, по крайней мере, для нас это было.
Вы действительно должны делать то, что человек говорит в этом ответе: qaru.site/questions/83574/...
В принципе, вы ДОЛЖНЫ использовать API работы.