Я недавно настроил пул соединений в tomcat и заметил как в тестовой среде, так и в моей среде разработчика, что после запуска приложения, скажем, в течение 12 часов, мое приложение зависает. Копаясь немного, я замечаю, что он зависает при первой операции дБ. В моем dev-окружении я получаю SQLException о том, что нет доступных соединений. Используя администратора MYSQL, я вижу, что на самом деле активных соединений вообще нет.
Мой технический стек - Spring3, использующий Hibernate и JPA, а также Hibernate Search для индексации. Соответствующий конфиг выглядит следующим образом:
WebApp / 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