1

以下是配置细节:

<property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">
     org.hibernate.dialect.Oracle9iDialect
    </prop>
    <prop key="hibernate.show_sql">false</prop>
    <prop key="hibernate.cache.provider_class">
     org.hibernate.cache.OSCacheProvider
    </prop>
    <prop key="hibernate.cache.use_second_level_cache">
     true
    </prop>
    <!-- <prop key="hibernate.hbm2ddl.auto">update</prop>-->
    <!-- HIBERNATE CONNECTION POOLING!!-->
    <prop key="c3p0.acquire_increment">5</prop>
    <prop key="c3p0.idle_test_period">100</prop>
    <!-- seconds -->    
    <prop key="c3p0.max_statements">5</prop>
    <prop key="c3p0.min_size">15</prop>
                            <prop key="c3p0.max_size">100</prop> 
    <prop key="c3p0.timeout">100</prop>
    <!-- seconds -->
   </props>
  </property>

我们的应用程序是通过 Spring & Hibernate 开发的。

一旦我们启动应用程序并点击它,它会打开 140 个连接而不释放它。

我们的 DAO 看起来像这样:

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
...
public class ActionDAO extends HibernateDaoSupport implements IActionDAO {
 public Action findById(ActionPK actionPK) {
  return (Action) getHibernateTemplate().get(Action.class, actionPK);
 }

 public void add(Action action) {
  getHibernateTemplate().save(action);
 }
}
4

6 回答 6

2

前段时间我们也遇到过类似的问题,根本原因是在应用程序终止之前,Hibernate 会话工厂没有关闭。虽然我知道您正在使用 Spring,它应该自动处理这个问题,但它仍然值得检查。

于 2010-03-20T13:07:15.250 回答
1

您的会话是交易的一部分吗?如果是,则会话/连接关闭可能仅在事务结束时发生,如果没有发生,您将获得泄漏的连接。

在 org.hibernate.jdbc 和 org.hibernate.transaction 上启用调试日志记录可能会有所帮助......还可以查看 HibernateTemplate 类(HibernateDaoSupport 使用)并查看如何配置会话创建/关闭的选项。您可能只想将 DAO 对象包装在 Spring 事务包装器或类似的东西中。

于 2010-03-19T18:40:41.700 回答
1

我认为您的 c3p0 设置没有受到影响,因为您有 > 100 db 连接。话虽如此,您应该将 idle_test_period 设置为小于 c3p0 超时的值。

此外,哪个版本的休眠在确定为什么不使用 c3p0 方面很重要。

你也提到了春天;你需要看看你在交易方面做了什么。您是否有某种服务或某种服务,或者在您的情况下,没有将您的 DAO 使用包装在交易中?

于 2010-03-19T18:46:23.393 回答
0

如果你正在使用 spring 自动装配和 hibernateTemplate

请确保您没有创建多个 HibernateTemplate 实例,即

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/applicationContext.xml");
Object o=context.getBean("hibernateTemplate");

该对象o必须缓存在某处,并在您的应用程序代码请求 hibernatetemplate 实例时返回。

谢谢

于 2011-06-21T14:04:41.930 回答
0

删除最小尺寸并尝试:c3p0.min_size

于 2013-11-07T08:14:30.760 回答
0

我在Jboss-hibernate. 我们的印象是,在事务会话下执行读取操作时,不需要提交事务。然而,我们意识到事务必须提交,尽管它只是一个读取操作(如果你已经开始了一个事务)。一旦我们在各处提交事务,泄漏就消失了。

错误代码是这样的:

  1. 开始交易
  2. 执行读操作
  3. 关闭会话

上述替换为以下程序,泄漏消失了。

  1. 开始交易
  2. 执行读操作
  3. 提交交易
  4. 关闭会话
于 2015-06-04T08:44:09.670 回答