我最近在tomcat中设置了连接池,并在测试环境和我的开发环境中注意到应用程序运行12个小时后我的应用程序挂起。挖掘一下我注意到它在第一个db操作时挂起。在我的开发环境中,我得到一个SQLException,说没有可用的连接。使用MYSQL管理员,我发现实际上根本没有活动连接。
我的技术堆栈是使用Hibernate和JPA以及Hibernate Search进行索引的Spring3。相关配置如下:
web应用/ META-INF / context.xml中
<Context>
<Resource name="jdbc/ccforumdb"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="ccuser"
password="ccuser"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/ccforum" />
</Context>
的web.xml
<resource-ref>
<description>ccforum db connection</description>
<res-ref-name>jdbc/ccforumdb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
的applicationContext.xml
<context:annotation-config />
<context:component-scan base-package="wcpackage" />
<tx:annotation-driven transaction-manager="transactionManager" />
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<util:properties id="appProperties" location="classpath:application.properties" />
<util:properties id="jdbcProperties" location="classpath:jdbc.properties" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory" />
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:jpaVendorAdapter-ref="jpaAdapter">
<property name="loadTimeWeaver">
<bean
class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
</property>
<property name="persistenceUnitName" value="wctemplatePU"></property>
</bean>
<bean id="jpaAdapter"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
p:showSql="#{jdbcProperties['jpa.showSql']}" />
的persistence.xml
<persistence-unit name="wctemplatePU" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.connection.datasource" value="java:comp/env/jdbc/ccforumdb" />
<property name="hibernate.hbm2ddl.auto" value="${hibernate.hbm2ddl.auto}" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" />
<property name="hibernate.search.default.directory_provider"
value="filesystem"/>
<property name="hibernate.search.default.indexBase"
value="lucene/indexes"/>
</properties>
</persistence-unit>
任何可以在一些特别明显的愚蠢上流下的光都会非常感激。
编辑**
道
public abstract class JpaDao<K, E> implements Dao<K, E> {
protected Class<E> entityClass;
@PersistenceContext protected EntityManager entityManager;
public JpaDao() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
this.entityClass = (Class<E>) genericSuperclass.getActualTypeArguments()[1];
}
public E update(E entity) { return entityManager.merge(entity); }
public void persist(E entity) { entityManager.persist(entity); }
public void remove(E entity) { entityManager.remove(entity); }
public E findById(K id) { return entityManager.find(entityClass, id); }
}
编辑**
2011-10-04 09:02:32,726 [tomcat-http--9] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Creating new transaction with name [com.dstgs.ccforum.biz.JpaTopicService.getById]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '',-java.lang.Exception
2011-10-04 09:02:32,726 [tomcat-http--9] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Opened new EntityManager [org.hibernate.ejb.EntityManagerImpl@5471e] for JPA transaction
2011-10-04 09:02:32,727 [tomcat-http--9] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Exposing JPA transaction as JDBC transaction [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@800bd0]
2011-10-04 09:02:32,742 [tomcat-http--9] TRACE org.springframework.orm.jpa.JpaTransactionManager - Triggering beforeCommit synchronization
2011-10-04 09:02:32,742 [tomcat-http--9] TRACE org.springframework.orm.jpa.JpaTransactionManager - Triggering beforeCompletion synchronization
2011-10-04 09:02:32,742 [tomcat-http--9] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Initiating transaction commit
2011-10-04 09:02:32,742 [tomcat-http--9] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Committing JPA transaction on EntityManager [org.hibernate.ejb.EntityManagerImpl@5471e]
2011-10-04 09:02:32,745 [tomcat-http--9] TRACE org.springframework.orm.jpa.JpaTransactionManager - Triggering afterCommit synchronization
2011-10-04 09:02:32,747 [tomcat-http--9] TRACE org.springframework.orm.jpa.JpaTransactionManager - Triggering afterCompletion synchronization
2011-10-04 09:02:32,747 [tomcat-http--9] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Closing JPA EntityManager [org.hibernate.ejb.EntityManagerImpl@5471e] after transaction