我刚刚更新到 Hibernate 4.0 并看到警告消息:
HHH000387: ResultSet's statement was not registered
在我的日志文件中。这是什么意思,我应该担心吗?
我刚刚更新到 Hibernate 4.0 并看到警告消息:
HHH000387: ResultSet's statement was not registered
在我的日志文件中。这是什么意思,我应该担心吗?
查看JdbcResourceRegistryImpl
引发此错误的类的源代码,我个人认为将其记录在 WARN 级别是过分的;它最多应该是 INFO ,除非有办法将所有Statement
s 隐式注册为 Hibernate/framework 配置的一部分。
我不清楚为什么Statement
要注册 a,但如果它只是 Hibernate 内部工作的一个问题,那么定期警告 API 用户这是一个错误,对吧?
我不会太担心。在任何情况下,API 的用户似乎都无法避免此消息。日志记录在 org.hibernate.engine.jdbc.internal.JdbcResourceRegistryImpl 中完成。根据文件:
JdbcResourceRegistry 的主要功能是确保资源得到清理。
看一下代码就知道,这样的消息是在两种情况下记录的:
此日志消息是一个标志,ResultSet.getStatement()
它不返回Statement
最初要求创建ResultSet
. (它也可能表示内存泄漏。)使用 JDBC 包装器时可能会发生这种情况,因为有两个Statement
对象:包装器/装饰器和底层的Statement
.
在我的项目中,我有自己的 JDBC 包装器用于测试。ResultSet
我通过确保getStatement()
返回原始Statement
代理(而不是新代理)而不是委托给底层ResultSet
(这将返回底层)来修复我的包装器中的这个警告Statement
。
任何产生类似警告的 JDBC 包装器都可能使用类似的修复程序。(类似的问题和修复可能适用于该方法Statement.getConnection()
。)
顺便说一句,这里有一个关于这个日志的错误报告:https ://hibernate.atlassian.net/browse/HHH-8210
你配置连接池了吗?我也有同样的警告。但是,如果我在我的 maven 依赖项中添加了 c3p0 并在 hibernate.cfg.xml 中正确配置了它。警告消失。
就我而言,此警告表明存在巨大的性能泄漏!我有带有 @oneToOne 映射的休眠 POJO 对象。对于一个表,它工作正常并且没有警告:它向 MySQl 服务器发送一个请求以获取所有记录,然后为每个连接表发送一个请求。对于我收到此错误的 POJO(当没有找到 @oneToOne 时):它发送一个初始请求以获取所有对象的列表,然后每次都为每条记录发送新的和新的映射表请求。
所以,假设我的测试数据库中有 2000 条记录。和 3 个@oneToOne 映射表。
在一个好的情况下,它会发送 1 个获取列表的请求和 3 个获取映射表的请求。
在出现警告的情况下,它会发送 1 个获取列表的初始请求。然后发送 3 个请求以获取数据库中 2000 条记录中的每条记录的映射信息!因此,每次调用@Controller(Spring MVC)时,每个用户都有 1999*3=5997 个额外请求。
当 Web 应用程序和 MySQL 服务器在同一台服务器上时,我没有注意到它。