HHH000387 Hibernate警告意味着什么?

时间:2012-01-04 05:12:48

标签: hibernate hibernate-4.x

我刚刚更新到Hibernate 4.0并且看到了警告消息:

HHH000387: ResultSet's statement was not registered

在我的日志文件中。这是什么意思,我应该担心吗?

5 个答案:

答案 0 :(得分:1)

我不会太担心。在任何情况下,看起来它都不在API的用户手中以避免此消息。记录在org.hibernate.engine.jdbc.internal.JdbcResourceRegistryImpl中完成。根据{{​​3}}:

  

JdbcResourceRegistry的主要功能是确保资源   得到清理。

简短的代码告诉我,这种消息记录在两种情况下:

  1. ResultSet通过register-method注册,语句未注册。
  2. ResultSet通过release-method释放,语句未注册。

答案 1 :(得分:1)

查看抛出此错误的JdbcResourceRegistryImpl类的源代码,我个人认为将其登录到WARN级别是过分的;它应该最多为INFO,除非有办法让所有Statement隐式注册为Hibernate /框架配置的一部分。

我不清楚为什么要注册Statement,但如果它只是Hibernate内部工作的关注点,那么定期警告API用户这是一个错误,对吗?

答案 2 :(得分:1)

此日志消息表示ResultSet.getStatement()未返回最初被要求创建Statement的{​​{1}}。 (它也可能表示内存泄漏。)使用JDBC包装器时会发生这种情况,因为有两个ResultSet对象:包装器/装饰器和底层Statement

在我的项目中,我有自己的JDBC包装器进行测试。我通过确保Statement返回原始ResultSet代理(新代理)而不是委托给基础代理getStatement(),在我的Statement包装器中修复了此警告{1}}(将返回基础ResultSet)。

任何产生类似警告的JDBC包装器都可能使用类似的修复程序。 (类似的问题和修复可能适用于方法Statement。)

顺便提一下,此处有一个针对此日志记录的错误报告:https://hibernate.atlassian.net/browse/HHH-8210

答案 3 :(得分:0)

您是否配置了连接池?我得到了同样的警告。但是如果我在maven依赖项中添加c3p0并在hibernate.cfg.xml中正确配置它。警告消失了。

答案 4 :(得分:0)

在我的情况下,此警告是巨大性能泄漏的指标! 我用@oneToOne映射来休眠POJO对象。对于一个表,它工作正常,没有警告:它向MySQl服务器发送一个请求以获取所有记录,然后为每个连接表发送一个请求。 对于我收到此错误的POJO(当没有找到@oneToOne时):它发送一个初始请求获取所有对象的列表,然后每次为每个记录发送新的和新的映射表请求。

所以,让我们说我的测试数据库中有2000条记录。 3个@oneToOne映射表。

在一个好的情况下,它发送1个获取列表的请求和3个获取映射表的请求。

如果出现警告,则会发送1个获取列表的初始请求。然后发送3个请求获取数据库中每条2000条记录的映射信息!因此,对于每个调用@Controller(Spring MVC)的每个用户,1999 * 3 = 5997个额外请求。

当Web应用程序和MySQL服务器位于同一台服务器上时,我没有注意到它。