Voj*_*ěch 8 java hibernate jpa c3p0
在我们的项目中,我们已经更新了Spring to 4.3.14.RELEASE和Hibernate 4.3.11.Final,因为我们已经开始看到两个警告:
WARN JDBC重置的连接与最初准备的连接不同 - 请确保使用连接释放模式ON_CLOSE(默认值)并运行Hibernate 4.2+(或将HibernateJpaDialect的prepareConnection标志切换为false
ON_CLOSE我们不想要的 - 当我们的应用程序处于高负载时,在某些时候它会停止释放连接并且应用程序卡住了.这适用于释放模式AFTER_TRANSACTION.prepareConnection标志切换到会发生什么false?我试图在Hibernate配置中找到这样的标志,但找不到它.GooGooStatementCache:441 - Multiply准备好的声明!
编辑:我更新了Hibernate 5.2.13.Final.
以下是多重准备语句的解释(来自GooGooStatementCache 源):
此 Connection 已准备好相同的语句,并且其他实例尚未关闭,因此语句池必须准备第二个PreparedStatement 对象,而不是重用先前缓存的 Statement。新的语句将被缓存,以防您经常需要该语句的多个副本。
在英语中,这意味着PreparedStatement在签入相同的内容Connection之前PreparedStatement从相同的Connection内容中签出相同的内容。这是不寻常的。一次只有一个客户端,Thread通常与一个客户端交互,如果需要多次,Connection通常会重复使用相同的客户端(重置其参数)。PreparedStatement发生这种情况最可能的原因可能是应用程序没有打开close()它PreparedStatement,而是依靠 c3p0 在签入时清理它们Connection。
无论如何,这不是正确性问题,c3p0 会很好地处理这种情况。但它可能反映了可以稍微清理的代码(close()-ing PreparedStatement使用后立即清理或重用它们)以提高内存和资源使用效率。如果您使用的是当前版本 (0.9.5.2),c3p0 应该已向您显示有问题的文本PreparedStatement。
我不知道你为什么会看到 Spring/Hibernate 警告。c3p0 check outConnection是代理,但它们的身份在客户端可见的生命周期内不会改变。稍微看一下源代码Connection,在获取与 a 相关联的过程中存在一些反射和间接Session,然后将其与签出的进行比较。也许某些原因会导致即使在使用和 时Session也刷新其关联的内容?我希望我能提供更多帮助,但我不确定发生了什么。ConnectionConnectionSession