我的JAVA应用程序使用多线程一次处理多个请求。因此,使用不同的线程同时处理不同的请求。
我正在使用hibernate和C3P0访问我的Oracle数据库,使用以下hibernate.properties:
hibernate.bytecode.use_reflection_optimizer=false
hibernate.connection.driver_class=oracle.jdbc.OracleDriver
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
hibernate.search.autoregister_listeners=false
hibernate.connection.url=${jdbc.url}
hibernate.default_schema=${jdbc.schema}
hibernate.connection.username=${jdbc.username}
hibernate.connection.password=${jdbc.password}
hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=10
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50
和c3p0.properties:
c3p0.preferredTestQuery=SELECT 1 from dual
c3p0.testConnectionOnCheckin=true
c3p0.idleConnectionTestPeriod=10
c3p0.driverClass=oracle.jdbc.driver.OracleDriver
(我也用testConnectionOnCheckout而不是testConnectionOnCheckin测试了它)。
我的java代码执行以下操作:
Session session = sessionFactory.openSession();
try{
session.beginTransaction();
Log.debug(localizator + "Start");
processCounters(id, user, session);
Log.debug(localizator + "Stop");
session.getTransaction().commit();
} finally{
session.close();
}
当我运行它时,它为每个线程打印“开始”,但在一个持久化中“锁定”到数据库,并且不打印“停止”。
如果我在数据库中观看已打开的会话,则会打开10个会话(在c3p0配置的最大数量),但所有会话都处于空闲状态。 有没有办法让c3p0释放一些空闲连接,所以至少,其中一个线程结束了它的进程(appart来增加最大连接数)?
答案 0 :(得分:0)
将连接池更改为BoneCP已解决了该问题。我使用了以下配置(我认为可以调整它以进一步提高流程的速度):
bonecp.idleMaxAge=240
bonecp.idleConnectionTestPeriod=60
bonecp.partitionCount=3
bonecp.acquireIncrement=1
bonecp.maxConnectionsPerPartition=5
bonecp.minConnectionsPerPartition=2
bonecp.statementsCacheSize=50
bonecp.releaseHelperThreads=3
现在它没有挂起,更好的是,它提高了查询的性能。