我有一个使用c3p0 0.9.1.2,hibernate 3.2.1.ga和
spring 2.5.5.问题是数据库连接没有自行关闭.这是日志:
[22 mars 2012 12:29:56,091] DEBUG com.mchange.v2.resourcepool.BasicResourcePool [“http-apr-8080”-exec-4] acquire test — pool is already maxed out. [managed: 20; max: 20]
[22 mars 2012 12:29:56,091] DEBUG com.mchange.v2.resourcepool.BasicResourcePool [“http-apr-8080”-exec-4] awaitAvailable(): com.mchange.v2.c3p0.impl.NewPooledConnection@15cc604
[22 mars 2012 12:29:56,091] DEBUG com.mchange.v2.resourcepool.BasicResourcePool [“http-apr-8080”-exec-4] trace com.mchange.v2.resourcepool.BasicResourcePool@6b0524 [managed: 20,unused: 0,excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@15cc604)
这是数据源配置:
<!-- Local DataSource that works in any environment --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${database.driver}"/> <property name="jdbcUrl" value="${database.url}"/> <property name="user" value="${database.user}"/> <property name="password" value="${database.password}"/> <!--<property name="connectionCustomizerClassName" value="org.xxx.webapp.common.persistence.WatchConnectionCustomizer"/>--> <property name="maxStatements" value="500"/> <property name="maxIdleTime" value="1800"/> <property name="maxPoolSize" value="100"/> <property name="minPoolSize" value="2"/> <property name="initialPoolSize" value="2"/> <property name="acquireIncrement" value="3"/> <property name="idleConnectionTestPeriod" value="3000"/> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionfactorybean" > <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">false</prop> <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> <prop key="hibernate.connection.autocommit">${hibernate.connection.autocommit}</prop> <prop key="hibernate.transaction.auto_close_session">${hibernate.transaction.auto_close_session}</prop> <prop key="hibernate.connection.release_mode">${hibernate.connection.release_mode}</prop> <prop key="hibernate.bytecode.use_reflection_optimizer">${hibernate.bytecode.use_reflection_optimizer}</prop> <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> <prop key="hibernate.cache.use_query_cache">true</prop> <prop key="hibernate.cache.use_second_level_cache">true</prop> <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</prop> </props> </property> <property name="annotatedClasses"> <list> ... </list> </property> <property name="dataSource"> <ref bean="dataSource" /> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean>
这是我们的通用Dao
public class GenericDAO<T,PK extends Serializable> extends HibernateDaoSupport implements IGenericDAO<T,PK> { private Class<T> clazz; private Logger logger = Logger.getLogger(GenericDAO.class); private static Session session; public GenericDAO(Class<T> clazz) { this.clazz = clazz; } public void refresh(T instanceToRefresh) throws DataAccessException { getHibernateTemplate().refresh(instanceToRefresh); //getCurrentSession().refresh(instanceToRefresh); } public void saveOrUpdate(T instanceToSaveOrUpdate) throws DataAccessException { //getCurrentSession().saveOrUpdate(instanceToSaveOrUpdate); getHibernateTemplate().saveOrUpdate(instanceToSaveOrUpdate); } public void persist(T instanceToPersist) throws DataAccessException { getHibernateTemplate().persist(instanceToPersist); //getCurrentSession().persist(instanceToPersist); } @SuppressWarnings("unchecked") public T merge(T instanceToMerge) throws DataAccessException { T instanceMerged = (T) getHibernateTemplate().merge(instanceToMerge); //T instanceMerged = (T) getCurrentSession().merge(instanceToMerge); return instanceMerged; } @SuppressWarnings("unchecked") public PK save(T newInstance) throws DataAccessException { return (PK) getHibernateTemplate().save(newInstance); //return (PK) getCurrentSession().save(newInstance); } public void delete(T persistentObject) throws DataAccessException { getHibernateTemplate().delete(persistentObject); //getCurrentSession().delete(persistentObject); } @SuppressWarnings("unchecked") public T load(PK id) { return (T) getHibernateTemplate().get(clazz,id); //return (T) getCurrentSession().get(clazz,id); } public void update(T transientObject) throws DataAccessException { //getCurrentSession().update(transientObject); getHibernateTemplate().update(transientObject); } @SuppressWarnings("unchecked") public List<T> loadAll() throws DataAccessException { //Session session = this.getCurrentSession(); //return session.createQuery("from " + clazz.getName()).list(); return getHibernateTemplate().loadAll(clazz); } }
提前致谢.