我有一个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>
如何配置本地DataSource到MySQL?连接池如何配置?在MySQL服务器中连接超时设置为默认值(8小时)还是更改?此异常是否继续显示或在多次刷新后消失? PS:BaseEntityDAO与问题无关,它不控制交易/连接,因此您可以将其从问题中删除。 –
感谢您的回复 - 我已根据您的要求编辑了neew信息的问题。另外 - 不管怎样,除非我停止并启动应用程序,否则该例外会一直显示。 - 谢谢 –