是否为每个数据库查询初始化 c3p0 池?

Posted

技术标签:

【中文标题】是否为每个数据库查询初始化 c3p0 池?【英文标题】:Is c3p0 pool initiallised for every database query? 【发布时间】:2016-06-24 08:14:36 【问题描述】:

我正在使用 postgresql + hibernate + c3p0 进行池管理。

我可以看到,对于每个数据库查询,c3p0 都在初始化,根据我的理解,这应该发生一次,而不是每个查询,否则连接池的意义何在。如有错误请指正。

相关信息:

    <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">20</property>
    <property name="hibernate.c3p0.timeout">1800</property>
    <property name="hibernate.c3p0.max_statements">0</property>
    <property name="hibernate.c3p0.idle_test_period">1500</property>



SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); //create session factory object
    Session session = sessionFactory.openSession();

    try

    String query = "SQL query here!!!";
    list = session.createQuery(query).list();
    catch (HibernateException e)
        System.out.println("Exception occured");
         e.printStackTrace();
    
    finally
        session.close();
        sessionFactory.close();
    

2016 年 1 月 10 日上午 12:45:13 org.hibernate.boot.jaxb.in​​ternal.stax.LocalXmlResourceResolver resolveEntity 警告:HHH90000012:已识别过时的休眠命名空间http://hibernate.sourceforge.net/hibernate-configuration。请改用命名空间http://www.hibernate.org/dtd/hibernate-configuration。可以随时删除对过时 DTD/XSD 命名空间的支持。 2016 年 3 月 10 日上午 12:45:13 org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator instantiateExplicitConnectionProvider 信息:HHH000130:实例化显式连接提供程序:org.hibernate.c3p0.internal.C3P0ConnectionProvider 2016 年 3 月 10 日上午 12:45:13 org.hibernate.c3p0.internal.C3P0ConnectionProvider 配置 信息:HHH010002:C3P0 使用驱动程序:org.postgresql.Driver 在 URL:jdbc:postgresql://localhost:5432/test 2016 年 3 月 10 日上午 12:45:13 org.hibernate.c3p0.internal.C3P0ConnectionProvider 配置 信息:HHH10001001:连接属性:user=postgres,password=**** 2016 年 3 月 10 日上午 12:45:13 org.hibernate.c3p0.internal.C3P0ConnectionProvider 配置 信息:HHH10001003:自动提交模式:假 2016 年 3 月 10 日上午 12:45:14 org.hibernate.c3p0.internal.C3P0ConnectionProvider 配置 信息:HHH10001007:JDBC 隔离级别: 2016 年 3 月 10 日上午 12:45:14 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager 信息:初始化 c3p0 池... com.mchange.v2.c3p0.PoolBackedDataSource@2b918bfb [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@e2340fd6 [acquireIncrement -> 3,acquireRetryAttempts -> 30,acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1hgf08x9fpqzsmd1pj0rtd|571a34ba, idleConnectionTestPeriod -> 500, initialPoolSize -> 5, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 1800, maxIdleTimeExcessConnections -> 0, maxState -> 0, maxPoolSize ->2 0, maxStatementsPerConnection -> 0, minPoolSize -> 5, nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@7ee60818 [描述-> null, driverClass -> null, factoryClassLocation -> null, identityToken -> 1hgf08x9fpqzsmd1pj0rtd|70605aa2, jdbcUrl -> jdbc:postgresql://localhost:5432/test, properties -> user=******, password=* ***** ],preferredTestQuery -> null,propertyCycle -> 0,statementCacheNumDeferredCloseThreads -> 0,testConnectionOnCheckin -> false,testConnectionOnCheckout -> false,unreturnedConnectionTimeout -> 0,usesTraditionalReflectiveProxies -> false; userOverrides: ], dataSourceName -> null, factoryClassLocation -> null, identityToken -> 1hgf08x9fpqzsmd1pj0rtd|5f1ff580, numHelperThreads -> 3 ]

【问题讨论】:

【参考方案1】:

c3p0 将创建一个连接池并重新使用连接,因为完整的代码不存在,并且您提供的日志中没有任何内容表明重新初始化,我可以假设您没有重新使用SessionFactory。

【讨论】:

感谢您的指点。一定是这样的。非常感谢您的帮助。我一定会检查的。【参考方案2】:

我没有看到完整的代码。但我相信下面的线 SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 将创建自己的池。您可以将该行放在静态块中。

【讨论】:

感谢您的指点。一定是这样的。非常感谢您的帮助。我一定会检查的。

以上是关于是否为每个数据库查询初始化 c3p0 池?的主要内容,如果未能解决你的问题,请参考以下文章

数据库连接池——C3P0

JavaEE基础(06):Servlet整合C3P0数据库连接池

数据库连接池c3p0和Druid使用教程

一个比 c3p0 快200倍的数据库连接池,这么牛?

比c3p0还快200倍的数据库连接池你知道吗?

比c3p0还快200倍的数据库连接池你知道吗?