Hibernate HH000387休眠警告是什么意思?

Hibernate HH000387休眠警告是什么意思?,hibernate,hibernate-4.x,Hibernate,Hibernate 4.x,我刚刚更新到Hibernate 4.0,看到警告消息: hh000387:ResultSet的语句未注册 在我的日志文件中。这意味着什么?我应该担心吗?我不会太担心。在任何情况下,API的用户似乎都无法避免此消息。日志记录在org.hibernate.engine.jdbc.internal.jdbresourceRegistryImpl中完成。根据: JdbcResourceRegistry的主要功能是确保 打扫干净 对代码的简短观察表明,此类消息记录在两种情况下: ResultSet通过re

我刚刚更新到Hibernate 4.0,看到警告消息:

hh000387:ResultSet的语句未注册


在我的日志文件中。这意味着什么?我应该担心吗?

我不会太担心。在任何情况下,API的用户似乎都无法避免此消息。日志记录在org.hibernate.engine.jdbc.internal.jdbresourceRegistryImpl中完成。根据:

JdbcResourceRegistry的主要功能是确保 打扫干净

对代码的简短观察表明,此类消息记录在两种情况下:

  • ResultSet通过register方法注册,而语句未注册
  • ResultSet是通过release方法发布的,语句未注册

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


    我不清楚为什么应该注册
    语句,但如果它只是Hibernate内部工作的问题,那么定期警告API用户这是一个错误,对吗?

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

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

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


    顺便说一下,这里有一个关于此日志记录的错误报告:

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

    在我的例子中,此警告是巨大性能泄漏的指示器! 我有带@oneToOne映射的hibernate POJO对象。对于一个表,它工作正常并且没有警告:它向MySQl服务器发送一个请求以获取所有记录,然后对每个连接的表发送一个请求。 对于POJO,我遇到了这个错误(当找不到@oneToOne时):它发送一个初始请求以获取所有对象的列表,然后每次都为每个记录发送新的和新的映射表请求

    假设我的测试数据库中有2000条记录。和3个@oneToOne映射表

    在一个好的例子中,它发送1个获取列表的请求和3个获取映射表的请求

    在警告的情况下,它发送1个获取列表的初始请求。然后发送3个请求,以获取数据库中2000条记录的映射信息!因此1999*3=5997每个用户对@Controller(Spring MVC)的每次调用的额外请求


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

    我也想知道这个问题的答案。