Я только что обновился до Hibernate 4.0 и вижу предупреждающее сообщение:
HHH000387: ResultSet statement was not registered
в моих файлах журналов. Что это значит, и я должен волноваться?
Я только что обновился до Hibernate 4.0 и вижу предупреждающее сообщение:
HHH000387: ResultSet statement was not registered
в моих файлах журналов. Что это значит, и я должен волноваться?
Я бы не стал слишком беспокоиться. В любом случае, похоже, что не в руках пользователей API, чтобы избежать этого сообщения. Ведение журнала выполняется в org.hibernate.engine.jdbc.internal.JdbcResourceRegistryImpl. По документации:
Основная функция JdbcResourceRegistry - убедиться, что ресурсы очиститься.
Короткий взгляд на код говорит, что такое сообщение регистрируется в двух ситуациях:
Глядя на источник класса JdbcResourceRegistryImpl
, который вызывает эту ошибку, я лично считаю, что наличие журнала на уровне WARN является чрезмерным; он должен быть INFO не более, если не существует способа, чтобы все Statement
неявно регистрировались как часть конфигурации Hibernate/framework.
Мне непонятно, почему нужно регистрировать Statement
, но если это касается только внутренней работы Hibernate, тогда регулярное предупреждение пользователей API об этом является ошибкой, верно?
Это сообщение журнала является признаком того, что ResultSet.getStatement()
не возвращает Statement
, из которого первоначально было предложено создать ResultSet
. (Это может также указывать на утечку памяти.) Это может произойти при использовании обертки JDBC, поскольку существуют два объекта Statement
: обертка/декоратор и базовый Statement
.
В моем проекте у меня есть собственная оболочка JDBC для тестирования. Я исправил это предупреждение в своей оболочке ResultSet
, убедившись, что getStatement()
возвращает исходный прокси-сервер Statement
(а не новый прокси-сервер) вместо делегирования базовому ResultSet
(который вернет базовый Statement
).
Любая обертка JDBC, которая производит подобные предупреждения, вероятно, может использовать аналогичное исправление. (Аналогичная проблема и исправление могут применяться к методу Statement.getConnection()
.)
Кстати, для этого ведения журнала есть отчет об ошибке: https://hibernate.atlassian.net/browse/HHH-8210
Вы настроили пул соединений? У меня такое же предупреждение. Но если я добавил c3p0 в свою зависимость от maven и правильно его настроил в hibernate.cfg.xml. Предупреждение исчезает.
В моем случае это предупреждение было индикатором огромной утечки производительности! У меня есть hibernate POJO-объекты с сопоставлением @oneToOne. Для одной таблицы он отлично работает и никаких предупреждений: он отправляет один запрос на сервер MySQl для получения всех записей, а затем для одного запроса для каждой объединенной таблицы. Для POJO, где я получаю эту ошибку (когда no @oneToOne не найден): он отправляет один первоначальный запрос для получения списка всех объектов, а затем каждый раз отправляет новые и новые запросы для сопоставленных таблиц для каждой записи.
Итак, скажем, у меня 2000 записей в моей тестовой БД. И 3 сопоставленные таблицы @oneToOne.
В хорошем случае он отправляет 1 запрос на получение списка и 3 запроса на получение сопоставленных таблиц.
В случае предупреждения он отправляет 1 начальный запрос для получения списка. Затем отправьте 3 запроса на получение сопоставленной информации для каждой из 2000 записей в БД! Итак, 1999 * 3 = 5997 дополнительных запросов для каждого пользователя для каждого вызова @Controller (Spring MVC).
Я не заметил этого, пока веб-приложение и сервер MySQL были на одном сервере.