【问题标题】:c3p0 Connection Pool not closing connectionsc3p0 连接池未关闭连接
【发布时间】:2012-03-22 15:00:32
【问题描述】:

我有一个 Using c3p0 0.9.1.2 ,hibernate 3.2.1.ga 和 spring 2.5.5。问题是数据库连接不会自行关闭。以下是日志:

[2012 年 3 月 22 日 12:29:56,091] 调试 com.mchange.v2.resourcepool.BasicResourcePool ["http-apr-8080"-exec-4] 获取测试 -- 池已满。 [管理:20;最大:20] [2012 年 3 月 22 日 12:29:56,091] 调试 com.mchange.v2.resourcepool.BasicResourcePool ["http-apr-8080"-exec-4] awaitAvailable(): com.mchange.v2.c3p0.impl.NewPooledConnection@15cc604 [2012 年 3 月 22 日 12:29:56,091] 调试 com.mchange.v2.resourcepool.BasicResourcePool ["http-apr-8080"-exec-4] 跟踪 com.mchange.v2.resourcepool.BasicResourcePool@6b0524 [管理:20,未使用:0,排除:0](例如 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>

这是我们的通用道

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);
}
}

提前致谢。

【问题讨论】:

  • 向我们展示你的 DAO 在应用上下文和 java 代码中的声明。

标签: java spring hibernate connection-pooling c3p0


【解决方案1】:

通常,连接会被休眠自动关闭。不过有几点需要注意:

  • 长时间运行的事务可能会占用一个连接
  • 不正确的会话管理可能意味着您没有关闭会话,这反过来又意味着连接仍在使用中

使用 spring 时的典型设置是使用 @Transactional 注释您的服务方法。这样,spring 将管理您的事务和会话。

【讨论】:

  • 非常感谢,您的回答对我很有帮助,我在所有服务方法中添加了@Transactional,问题解决了。
  • @Bozho:你指的是improper session management。你能举一个在 Spring/Hibernate 上下文中正确的会话管理的例子吗?
  • 每个请求(或每个对话)打开和关闭会话,而不是忘记关闭它
  • 这对我也有很大帮助。这让我意识到我错过了注释一些方法。谢谢!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2013-08-20
    • 1970-01-01
    • 2015-08-23
    • 2012-01-15
    • 2016-07-08
    • 2012-04-22
    相关资源
    最近更新 更多