c3p0没有获得连接,但是有空闲连接

时间:2013-04-26 15:55:02

标签: hibernate c3p0

我的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来增加最大连接数)?

1 个答案:

答案 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

现在它没有挂起,更好的是,它提高了查询的性能。