Подтвердить что ты не робот

Что означает предупреждение HHH000387 Hibernate?

Я только что обновился до Hibernate 4.0 и вижу предупреждающее сообщение:

HHH000387: ResultSet statement was not registered

в моих файлах журналов. Что это значит, и я должен волноваться?

4b9b3361

Ответ 1

Я бы не стал слишком беспокоиться. В любом случае, похоже, что не в руках пользователей API, чтобы избежать этого сообщения. Ведение журнала выполняется в org.hibernate.engine.jdbc.internal.JdbcResourceRegistryImpl. По документации:

Основная функция JdbcResourceRegistry - убедиться, что ресурсы очиститься.

Короткий взгляд на код говорит, что такое сообщение регистрируется в двух ситуациях:

  • ResultSet регистрируется с помощью метода register, а оператор не регистрируется.
  • ResultSet освобождается с помощью метода release и оператор не зарегистрирован.

Ответ 2

Глядя на источник класса JdbcResourceRegistryImpl, который вызывает эту ошибку, я лично считаю, что наличие журнала на уровне WARN является чрезмерным; он должен быть INFO не более, если не существует способа, чтобы все Statement неявно регистрировались как часть конфигурации Hibernate/framework.

Мне непонятно, почему нужно регистрировать Statement, но если это касается только внутренней работы Hibernate, тогда регулярное предупреждение пользователей API об этом является ошибкой, верно?

Ответ 3

Это сообщение журнала является признаком того, что ResultSet.getStatement() не возвращает Statement, из которого первоначально было предложено создать ResultSet. (Это может также указывать на утечку памяти.) Это может произойти при использовании обертки JDBC, поскольку существуют два объекта Statement: обертка/декоратор и базовый Statement.

В моем проекте у меня есть собственная оболочка JDBC для тестирования. Я исправил это предупреждение в своей оболочке ResultSet, убедившись, что getStatement() возвращает исходный прокси-сервер Statement (а не новый прокси-сервер) вместо делегирования базовому ResultSet (который вернет базовый Statement).

Любая обертка JDBC, которая производит подобные предупреждения, вероятно, может использовать аналогичное исправление. (Аналогичная проблема и исправление могут применяться к методу Statement.getConnection().)

Кстати, для этого ведения журнала есть отчет об ошибке: https://hibernate.atlassian.net/browse/HHH-8210

Ответ 4

Вы настроили пул соединений? У меня такое же предупреждение. Но если я добавил c3p0 в свою зависимость от maven и правильно его настроил в hibernate.cfg.xml. Предупреждение исчезает.

Ответ 5

В моем случае это предупреждение было индикатором огромной утечки производительности! У меня есть hibernate POJO-объекты с сопоставлением @oneToOne. Для одной таблицы он отлично работает и никаких предупреждений: он отправляет один запрос на сервер MySQl для получения всех записей, а затем для одного запроса для каждой объединенной таблицы. Для POJO, где я получаю эту ошибку (когда no @oneToOne не найден): он отправляет один первоначальный запрос для получения списка всех объектов, а затем каждый раз отправляет новые и новые запросы для сопоставленных таблиц для каждой записи.

Итак, скажем, у меня 2000 записей в моей тестовой БД. И 3 сопоставленные таблицы @oneToOne.

В хорошем случае он отправляет 1 запрос на получение списка и 3 запроса на получение сопоставленных таблиц.

В случае предупреждения он отправляет 1 начальный запрос для получения списка. Затем отправьте 3 запроса на получение сопоставленной информации для каждой из 2000 записей в БД! Итак, 1999 * 3 = 5997 дополнительных запросов для каждого пользователя для каждого вызова @Controller (Spring MVC).

Я не заметил этого, пока веб-приложение и сервер MySQL были на одном сервере.