简体   繁体   English

c3p0连接池没有关闭连接

[英]c3p0 Connection Pool not closing connections

I have a Using c3p0 0.9.1.2 , hibernate 3.2.1.ga and spring 2.5.5. 我有一个使用c3p0 0.9.1.2,hibernate 3.2.1.ga和spring 2.5.5。 The problem is the database connection doesn't close itself. 问题是数据库连接没有自行关闭。 Here are the logs : 这是日志:

[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. [22 mars 2012 12:29:56,091] DEBUG com.mchange.v2.resourcepool.BasicResourcePool [“http-apr-8080”-exec-4]获取测试池已经达到最大值。 [managed: 20; [管理: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] (eg com.mchange.v2.c3p0.impl.NewPooledConnection@15cc604) 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 [托管:20,未使用:0,排除:0](例如com.mchange.v2.c3p0.impl.NewPooledConnection@15cc604)

Here's the datasource configuration : 这是数据源配置:

<!-- 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>

Here's our generic Dao 这是我们的通用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);
}
}

Thanks in advance. 提前致谢。

Normally, the connection is automatically closed by hibernate. 通常,休眠会自动关闭连接。 However, a few things to note: 但是,有几点需要注意:

  • long-running transactions may occupy a connection 长时间运行的事务可能会占用连接
  • improper session management may mean you don't close your session, which in turn means the connection remains in use 不正确的会话管理可能意味着您不会关闭会话,这反过来意味着连接仍在使用中

The typical setup when using spring is to annotate your service methods with @Transactional . 使用spring时的典型设置是使用@Transactional注释您的服务方法。 That way spring will manage your transactions and sessions. 这样春天将管理您的交易和会话。

我们在dispatcher-servlet.xml文件中使用了以下行,数据库物理连接现在正在关闭。

<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM