2012-11-14 191 views
0

我有一個Web應用程序。我使用JPA(Hibernate作爲供應商),該應用程序在glassfish服務器上運行。使用該應用程序(包括檢索和保存實體到數據庫操作)幾分鐘後我得到這個錯誤:JDBC MySQL - 連接已關閉

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 爲什麼會出現這個錯誤?我或JPA在哪裏關閉連接?

編輯:刪除類「BaseEntityDAO」的細節 - 不相關。我的數據源通過在GlassFish的管理控制檯配置: 在JDBC連接池:

  • 資源類型:javax.sql.DataSource的
  • DataSource類名稱:com.mysql.jdbc.jdbc2。可選.MysqlDataSource
  • 使用glassfish的默認池設置 - 不知道它是否重要,但其中一個默認設置是「空閒超時」,其默認值爲300秒。
  • 在附加屬性我的hve以下屬性:端口號,的databaseName中ServerName,用戶,密碼

在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> 
+0

如何配置本地DataSource到MySQL?連接池如何配置?在MySQL服務器中連接超時設置爲默認值(8小時)還是更改?此異常是否繼續顯示或在多次刷新後消失? PS:BaseEntityDAO與問題無關,它不控制交易/連接,因此您可以將其從問題中刪除。 –

+0

感謝您的回覆 - 我已根據您的要求編輯了neew信息的問題。另外 - 不管怎樣,除非我停止並啓動應用程序,否則該例外會一直顯示。 - 謝謝 –

回答

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> 

我使用在許多項目中此配置,因爲多年。

+0

謝謝你的建議 - 我已經嘗試過你的配置(爲此我也添加了hibernate-c3p0依賴),但我得到這個異常:'org.springframework.web.util.NestedServletException:請求處理失敗;嵌套的異常是javax.persistence.PersistenceException:org.hibernate.exception.GenericJDBCException:無法打開連接# –

+0

其實我使用的是標準的Hibernate配置,無法幫助太多,真的很抱歉! –

相關問題