0

私はウェブアプリケーションを持っています。グラスフィッシュサーバー上で実行されるアプリケーションである JPA (Hibernate as vendor) を使用しています。アプリケーションを使用して数分後 (エンティティを取得して DB に保存する操作を含む)、次のエラーが発生します。

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Could not open connection
root cause

javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Could not open connection
root cause

org.hibernate.exception.GenericJDBCException: Could not open connection
root cause

java.sql.SQLException: Error in allocating a connection. Cause: java.lang.RuntimeException: Got exception during XAResource.start:
root cause

javax.resource.spi.ResourceAllocationException: Error in allocating a connection. Cause: java.lang.RuntimeException: Got exception during XAResource.start:
root cause

com.sun.appserv.connectors.internal.api.PoolingException: java.lang.RuntimeException: Got exception during XAResource.start:
root cause

com.sun.appserv.connectors.internal.api.PoolingException: java.lang.RuntimeException: Got exception during XAResource.start:
root cause

java.lang.RuntimeException: Got exception during XAResource.start:
root cause

javax.transaction.xa.XAException: com.sun.appserv.connectors.internal.api.PoolingException: javax.resource.spi.LocalTransactionException: No operations allowed after connection closed.

JTA トランザクション マネージャーを使用しています。私のサービス層のすべての関数には@Transactional注釈があります。これは私のpersistence.xmlです:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">
    <persistence-unit name="myPU" transaction-type="JTA">

        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>jdbc/myDataSource</jta-data-source>

        <class>org.company.entities.User</class>
            <!-- OTHER CLASSES -->

        <exclude-unlisted-classes />

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
            <property name="hibernate.transaction.flush_before_completion" value="true" />
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.connection.release_mode" value="auto"/>
            <property name="hibernate.current_session_context_class" value="jta"/>
            <property name="hibernate.transaction.auto_close_session" value="true"/>
<!--             <property name="hibernate.transaction.flush_before_completion" value="true"/> -->
<!--             <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory"/> -->
        </properties>

    </persistence-unit>
</persistence>

この mysql コネクタを使用しています:mysql-connector-java-5.1.22-bin.jar なぜこのエラーが発生するのですか? iまたはJPAが接続を閉じているのはどこですか?

編集:クラス「BaseEntityDAO」の詳細を削除 - 関係ありません。私のデータ ソースは、glassfish の管理コンソールを介して構成されます。JDBC 接続プールでは、次のようになります。

  • リソースの種類: javax.sql.DataSource
  • DataSource クラス名: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
  • 私はグラスフィッシュのデフォルトのプール設定を使用しています-それが問題かどうかはわかりませんが、デフォルト設定の1つは「アイドルタイムアウト」であり、そのデフォルト値は300秒です。
  • 追加のプロパティには、次のプロパティがあります: portNumber、databaseName、serverName、user、password

JDBC リソース:

  • JNDI 名: jdbc/myDataSource
  • プール名: 上記の JDBC 接続プールのプール名

これは私の春の構成です:

<jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence/myPersistenceUnit" />

<bean
    class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor">
    <property name="persistenceUnits">
        <map>
            <entry key="myPersistenceUnit" value="persistence/myPersistenceUnit" />
        </map>
    </property>
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" />

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/myDataSource" />

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg ref="dataSource" />
</bean>
4

1 に答える 1

0

この構成で C3P0 を試すことができます:

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="c3p0.testConnectionOnCheckout">false</property>
<property name="c3p0.min_size">2</property>
<property name="c3p0.max_size">10</property>
<property name="c3p0.timeout">300</property>
<property name="c3p0.max_statements">50</property>
<property name="c3p0.idleTestPeriod">300</property>

私は何年もの間、多くのプロジェクトでこの構成を使用しています。

于 2012-11-15T08:32:15.553 に答える