当前位置: 首页 > 知识库问答 >
问题:

c3p0创建的连接比配置中指定的多

伏德义
2023-03-14

我的应用程序使用的是Hibernate 4.1.7和c3p0 0.9.1。

我已经将应用程序的hibernate.cfg.xml文件中的c3p0.max_size属性设置为50,但是创建的JDBC连接数已经超过了这个值。而且,不活动/空闲连接不会被删除,这也是我在Hibernate配置中指定的。以下是我配置的一个片段:

<property name="c3p0.acquire_increment">1</property>
<property name="c3p0.autoCommitOnClose">false</property>
<property name="c3p0.max_size">50</property>
<property name="c3p0.min_size">1</property>
<property name="c3p0.numHelperThreads">1</property>
<property name="c3p0.maxIdleTime">30</property> 
<property name="c3p0.maxIdleTimeExcessConnections">20</property>
<property name="c3p0.maxConnectionAge">45</property>

我在代码中的finally块中显式关闭会话和会话工厂。下面是我用来创建SessionFactory实例的类:

package ics.sis.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

import ics.global.runtime.Environment;
import ics.util.properties.PropertiesISUWrapper;

public class HibernateSessionFactory {
    private static SessionFactory sessionFactory;
    private static ServiceRegistry serviceRegistry;
    private static final PropertiesISUWrapper ISU_PROPERTIES = new PropertiesISUWrapper(Environment.getName(),"VzAppIntegration"); 

    public static SessionFactory create() {
        Configuration configuration = new Configuration();
        configuration.configure();

        configuration.setProperty("hibernate.connection.url", ISU_PROPERTIES.getUrl());
        configuration.setProperty("hibernate.connection.password", ISU_PROPERTIES.getPassword());

        serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();        
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        return sessionFactory;
    }

}

下面是执行数据库事务的主要方法之一:

public static int insert(int aidm, String termCode, String wappCode) throws SQLException, ClassNotFoundException {      
        // Initialize session and transaction
        SessionFactory sessionFactory = HibernateSessionFactory.create();
        Session session = sessionFactory.openSession();
        Transaction tx = null;
        int applSeqno = 0;
        Stvwapp wapp = null;

        try {
            tx = session.beginTransaction();

            applSeqno = generateApplSeqNo(session, aidm);
            SarheadId sarheadIdDao = new SarheadId();
            sarheadIdDao.setSarheadAidm(aidm);
            sarheadIdDao.setSarheadApplSeqno((short)applSeqno);

            // Find STVWAPP row by WAPP code
            Query query = session.getNamedQuery("findStvwappByWappCode"); 
            query.setString("wappCode", wappCode);

            if (query.list().size() == 0) {
                throw new RuntimeException("Invalid WAPP code specified: " + wappCode);
            } else {
                wapp = (Stvwapp) query.list().get(0);
            }

            Sarhead sarheadDao = new Sarhead();
            sarheadDao.setId(sarheadIdDao);
            sarheadDao.setSarheadActivityDate(new java.sql.Timestamp(System.currentTimeMillis()));
            sarheadDao.setSarheadAddDate(new java.sql.Timestamp(System.currentTimeMillis()));
            sarheadDao.setSarheadAplsCode("WEB");
            sarheadDao.setSarheadApplAcceptInd("N");
            sarheadDao.setSarheadApplCompInd("N");
            sarheadDao.setSarheadApplStatusInd("N");
            sarheadDao.setSarheadPersStatusInd("N");
            sarheadDao.setSarheadProcessInd("N");
            sarheadDao.setSarheadTermCodeEntry(termCode);
            sarheadDao.setStvwapp(wapp);

            session.save(sarheadDao);
        } finally {
            tx.commit();
            session.close();
            sessionFactory.close(); 
        }

        return applSeqno;
    }

更新

[env:devl][]-2012-12-06 12:14:07 DEBUG BasicResourcePool:1644-跟踪com.mchange.v2.resourcePool.basicResourcePool@7F1D11B9[已管理:1,未使用:1,已排除:0](例如com.mchange.v2.c3p0.impl.newPooledConnection@7B3F1264)

共有1个答案

井修雅
2023-03-14

你是说:

我已经将应用程序的hibernate.cfg.xml文件中的c3p0.max_size属性设置为50,但是创建的JDBC连接数已经超过了这个值。

发生这种情况的原因是,在insert方法中,您正在调用create()方法。每次在create()方法中,您都构建一个全新的sessionFactory,如下所示:

 configuration.buildSessionFactory(serviceRegistry);

在该方法中,还可以关闭sessionFactory。创建和关闭sessionFactory实例都是非常昂贵的操作(您可以在这里看到closing方法)。

最重要的是,当应用程序在多个线程中同时服务多个请求时,每个线程都创建自己的sessionFactory(每个线程都创建自己的池)。因此系统中一次存在多个sessionFactory和连接池。而在应用程序的生存期内只应创建一次。因此,当有多个pool副本时,所有pool的连接总数可能超过您为一个pool配置的最大限制。

我建议您重写HibernateSessionFactory类,如Bellow所示:

public class HibernateSessionFactory {
    private static SessionFactory sessionFactory = HibernateSessionFactory.create();
    private static ServiceRegistry serviceRegistry;
    private static final PropertiesISUWrapper ISU_PROPERTIES = new PropertiesISUWrapper(Environment.getName(),"VzAppIntegration"); 

    private static SessionFactory create() {
        Configuration configuration = new Configuration();
        configuration.configure();

        configuration.setProperty("hibernate.connection.url", ISU_PROPERTIES.getUrl());
        configuration.setProperty("hibernate.connection.password", ISU_PROPERTIES.getPassword());

        serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();        
        return configuration.buildSessionFactory(serviceRegistry);

    }

    public static SessionFactory getSessionFactory(){
       return sessionFactory;
    }

}

insert()方法中,只需调用hibernateSessionFactory.getSessionFactory.getSessionFactory()而不是调用hibernateSessionFactory.create()

 类似资料:
  • 无法使用C3P0创建Hibernate-JPA连接池。面对以下错误日志: 请求请提供一个解决方案如何创建连接池使用JPA在KARAF。

  • 问题内容: 要指定SQLite连接属性,请使用org.sqlite.SQLiteConfig,它的内容如下: 使用c3p0创建连接池的过程如下: 问题:如何创建结合了两者的数据源,让我设置诸如连接池的最大池大小和sqlite的同步模式之类的东西? 问题答案: 尝试 现在,数据源将是c3p0 PooledDataSource,它包装了已根据需要配置的SQLite未池化数据源。 请参阅C3P0的文档,

  • 我正在使用Spring配置文件来配置C3P0。为了监视数据源,我配置了(如JavaMelody的用户指南所述)。但是我的报告显示了0个活动的jdbc连接,而我的minPoolSize是10。我错过了什么? 我尝试将作为在datasource中传递,并将作为: 但是驱动程序不是以这种方式注册的。

  • 我在应用程序中看到一个非常奇怪的行为。 我的应用程序设置:Spring Hibernate C3p0 应用程序保持运行良好,当突然我开始看到这些错误的日志和系统完全停止处理任何数据库特定的请求。 为什么C3p0需要在这个特殊的时间创建一个新的连接池,在这些异常之前,应用程序100%工作正常,响应良好 有什么线索吗? =========================================

  • 我正在使用resin服务器+spring框架和c3p0连接池。我已经使用以下属性文件配置了连接池。但不知怎的,每隔24小时左右,我的网站就会出现连接超时错误,然后我不得不重新启动我的resin服务器,让网站重新运行。请告诉我在下面的配置文件中有什么错误,以及我在这里缺少了什么。

  • 问题内容: 我正在将GWT与Hibernate,c3p0和MySQL结合使用,以产生一个受众有限的网络应用程序(每天最多50个用户)。在测试期间,我发现无论使用哪种方法,Hibernate都在打开每个会话的连接,但没有关闭它。 我当前的配置如下: 通过与应用程序的每个新连接,将创建一个新池。例如,如果我将池大小设置为3,则到应用程序的2个连接导致6个连接,直到应用程序关闭。 预期的行为是在每个事务