是否为每个数据库查询初始化了 c3p0 池?
Is c3p0 pool initiallised for every database query?
我正在使用 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 年 10 月 12:45:13 上午 org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
警告:HHH90000012:改为识别过时的休眠命名空间 http://hibernate.sourceforge.net/hibernate-configuration. Use namespace 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 ->I800Excess,maxIdleTime -> 1800Excess 0, maxPoolSize -> 20, maxStatements -> 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 ]
我没有看到完整的代码。但我相信线下
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
将创建自己的池。您可以将该行放在静态块中。
c3p0 将创建一个连接池并重新使用连接,因为完整的代码不存在并且您提供的日志中没有任何内容指示重新初始化,我可以假设您没有重新初始化-使用 SessionFactory。
我正在使用 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 年 10 月 12:45:13 上午 org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity 警告:HHH90000012:改为识别过时的休眠命名空间 http://hibernate.sourceforge.net/hibernate-configuration. Use namespace 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 ->I800Excess,maxIdleTime -> 1800Excess 0, maxPoolSize -> 20, maxStatements -> 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 ]
我没有看到完整的代码。但我相信线下 SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 将创建自己的池。您可以将该行放在静态块中。
c3p0 将创建一个连接池并重新使用连接,因为完整的代码不存在并且您提供的日志中没有任何内容指示重新初始化,我可以假设您没有重新初始化-使用 SessionFactory。