2012-01-04 93 views
23

我刚刚更新到Hibernate 4.0和我看到的警告消息:HHH000387休眠警告是什么意思?

HHH000387: ResultSet's statement was not registered

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

+2

我想知道这个问题的答案。 – 2012-04-11 22:02:22

回答

1

我不会太担心。无论如何,它看起来不是在API的用户手中来避免这个消息。日志记录在org.hibernate.engine.jdbc.internal.JdbcResourceRegistryImpl中完成。据documentation

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

短期看向代码告诉,这样的消息在两种情况下登录:

  1. 的ResultSet是通过寄存器方法进行注册,并声明未注册。
  2. ResultSet通过发布方法发布,并且语句未注册。
1

查看引发此错误的JdbcResourceRegistryImpl类的源代码,我个人认为它在WARN级别的日志过多;它最多应该是INFO,除非有办法将所有Statement隐式注册为Hibernate/framework配置的一部分。

我不清楚为什么Statement应该注册,但如果它只是Hibernate内部工作的一个问题,那么经常向API用户发出警告是一个错误,对吧?

1

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

在我的项目中,我有我自己的用于测试的JDBC包装器。我通过确保getStatement()返回原始Statement代理(一个新的代理),在我的ResultSet包装这样的警告,而不是委托给底层ResultSet(这将返回底层Statement)。

任何正在生成类似警告的JDBC包装器都可能使用类似的修复程序。 (类似的问题并解决,可向法Statement.getConnection()

顺便说一句,对于这个记录在这里的bug报告:https://hibernate.atlassian.net/browse/HHH-8210

0

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

0

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

因此,假设我的测试数据库中有2000条记录。和3 @一对一映射表。

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

在发出警告的情况下,它会发送1个获取列表的初始请求。然后发送3个请求,获取DB中每个2000记录的映射信息!因此,对于每个调用@Controller(Spring MVC),每个用户1999 * 3 = 5997个附加请求。

我没有注意到它,而Web应用程序和MySQL服务器在同一台服务器上。

相关问题