Что означает предупреждение о спящем режиме HHH000387? - PullRequest
23 голосов
/ 04 января 2012

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

HHH000387: ResultSet's statement was not registered

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

Ответы [ 5 ]

1 голос
/ 26 июля 2012

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

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

1 голос
/ 05 июля 2013

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

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

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

Кстати, здесь есть сообщение об ошибке для этой записи: https://hibernate.atlassian.net/browse/HHH-8210

1 голос
/ 06 мая 2012

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

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

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

  1. ResultSet зарегистрирован через register-метод, а оператор не зарегистрирован.
  2. ResultSet освобождается с помощью метода release, а оператор не регистрируется.
0 голосов
/ 19 июля 2017

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

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

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

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

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

0 голосов
/ 19 марта 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...