2012-11-14 193 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配置,无法帮助太多,真的很抱歉! –

相关问题