Hibernate 4.3-最后是否引起GoogoostatementCache乘以准备的陈述



我们有一个春季项目,我们使用

Spring Spring Data Hibernate c3p0

一切都很好,直到最后一个版本。我们开始看到很多 我们的日志中的INFO GooGooStatementCache:441。此外,在我们的服务器端发生了一些内存问题之后。我们开始对Java内存堆进行一些分析。似乎在我们获得很多INFO GooGooStatementCache:441的所有版本中,我们都有严重的内存泄漏。com.mysql.jdbc.JDBC4Connection没有免费。因此,我们有许多连接s打开。

我们怀疑从hibernate 3.6.3.Finalhibernate-entitymanager)到hibernate 3.0.Final的变化正在引起这些问题。

其他人会经历这样的事情?

谢谢,

alon

编辑:在:

之间切换
    <!-- <jpa.version>2.0.0</jpa.version> -->
    <hibernate.version>4.3.0-Final</hibernate.version>
    <hibernate.entitymanager.version>4.3.0.Final</hibernate.entitymanager.version>
    <!-- <hibernate.jpa-api.version>2.0-cr-1</hibernate.jpa-api.version> -->

to:

    <jpa.version>2.0.0</jpa.version>
    <hibernate.version>3.5.6-Final</hibernate.version>

和此:

    <dependency>
        <groupId>org.hibernate.java-persistence</groupId>
        <artifactId>jpa-api</artifactId>
        <version>${hibernate.jpa-api.version}</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>${hibernate.entitymanager.version}</version>
        <scope>compile</scope>
    </dependency>

to:

    <!-- Hibernate and JPA -->
    <!-- seems like we get jppa api from hibernate-entitymanager -->
    <!-- <dependency> -->
    <!-- <groupId>org.hibernate.java-persistence</groupId> -->
    <!-- <artifactId>jpa-api</artifactId> -->
    <!-- <version>${hibernate.jpa-api.version}</version> -->
    <!-- <scope>compile</scope> -->
    <!-- </dependency> -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>${hibernate.entitymanager.version}</version>
        <scope>compile</scope>
    </dependency>

防止INFO GooGooStatementCache:441 - Multiply prepared statement!问题因此,我们的设置和冬眠4.3.0-Final

似乎存在某种问题

有什么想法?

编辑2

更改为4.3.1. -final do 解决此问题

编辑3 感谢您的回复我的猜测是,它与c3p0和新的hibernate

无法正常工作。

这是我们将它们设置的方式

<!-- Declare a datasource that has pooling capabilities-->   
<bean id="jpaDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close"
    p:driverClass="${app.jdbc.driverClassName}"
    p:jdbcUrl="${app.jdbc.url}"
    p:user="${app.jdbc.username}"
    p:password="${app.jdbc.password}"
    p:acquireIncrement="5"
    p:idleConnectionTestPeriod="60"
    p:maxPoolSize="100"
    p:maxStatements="50"
    p:minPoolSize="10" />
<!-- Declare a JPA entityManagerFactory -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
    p:persistenceXmlLocation="classpath*:META-INF/persistence.xml"
    p:persistenceUnitName="hibernatePersistenceUnit"
    p:dataSource-ref="jpaDataSource"
    p:jpaVendorAdapter-ref="hibernateVendor"/>
<!-- Specify our ORM vendor -->
<bean id="hibernateVendor" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
            p:showSql="false"/>
<!-- Declare a transaction manager-->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" 
    p:entityManagerFactory-ref="entityManagerFactory"/>

这是持久性文件

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    version="1.0">
<persistence-unit name="hibernatePersistenceUnit"
    transaction-type="RESOURCE_LOCAL">
    <properties>
        <property name="hibernate.hbm2ddl.auto" value="update"/>
        <property name="hibernate.show_sql" value=${show.sql} /> 
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.dialect"    value="org.hibernate.dialect.MySQL5InnoDBDialect" />
    </properties>
    <mapping-file>META-INF/orm.xml</mapping-file>
</persistence-unit>
 </persistence>

编辑4 似乎移至Hibernate 4.3.1. -Final do 解决了问题。不要对准备陈述进行日志发出任何警告。和内存分析仪没有显示DB连接的任何泄漏。

问题连接hibernatec3p0spring的最佳方法是什么?使用hibernate-c3p0软件包或将c3p0软件包添加到POM?

所以,我无法解释您为什么在冬眠的较新版本中看到更多的信息,但是您看到的消息意味着您的应用程序正在尝试准备一个准备好的准备,已经由相同的数据库连接准备和缓存。但是,无法使用缓存的语句,因为它仍在使用中,因此尚未接近()。因此,正在准备同一陈述的新副本。(如果您经常同时重复使用该语句,则缓存将容纳这两个副本。)

从理论上讲,在某些情况下,这可能正是您打算做的。例如,在遍历数据库表中浏览递归结构时,您可以使用不同参数重复使用相同的查询来钻取水平,而顶级查询保持打开状态。

仍然,实际上这很少见。通常,如果您收到此消息,则可能意味着您的应用程序不会及时关闭()语句。从您描述的内容来看,听起来您可能也可能有连接泄漏,尽管您没有报告通常的结果,但是当池到达maxPoolSize时,该应用程序悬挂。(您没有报告太多有关C3P0配置的信息;也许您将maxPoolSize设置很大,并且在池耗尽之前遇到内存问题。)

您可能会尝试的一些事情:

1)检查您是否有连接泄漏。请参阅此处

2)简化问题:查看问题是否仅限于语句缓存,通过关闭语句缓存和比较行为。设置C3P0参数maxStatementsmaxStatementsPerConnection均为零。

最新更新