DBCP连接池配置如下:
bds.setDriverClassName(dbCfg.getString("jdbc"));
bds.setUrl(dbCfg.getString("url"));
bds.setUsername(dbCfg.getString("username"));
bds.setPassword(dbCfg.getString("password"));
bds.setMaxActive(dbCfg.getInt("maxactive", 100));
bds.setMaxIdle(dbCfg.getInt("maxidle", 50));
bds.setMinIdle(dbCfg.getInt("minidle", 20));
bds.setMaxWait(dbCfg.getInt("maxwait", 10000));
bds.setTestWhileIdle(true);
bds.setTimeBetweenEvictionRunsMillis(10000);
bds.setMinEvictableIdleTimeMillis(180000);测试时,当连接个数数超过120时,就会报异常,没有自动回收不使用的连接。
for(int i = 0 ; i < 130 ; i++){
System.out.println(i + 1);
Connection conn = DBMS.getConnection(Ocqs.DB_OCS);
Thread.sleep(5000);
}
c3p0配置如下:
c3p0.setIdleConnectionTestPeriod(dbCfg.getInt("idleConnectionTestPeriod", 60));
c3p0.setInitialPoolSize(dbCfg.getInt("initialPoolSize", 20));
c3p0.setMaxIdleTime(dbCfg.getInt("maxIdleTime", 60));
c3p0.setMaxPoolSize(dbCfg.getInt("maxPoolSize", 150));
c3p0.setMinPoolSize(dbCfg.getInt("minPoolSize", 20));
c3p0.setAcquireIncrement(dbCfg.getInt("acquireIncrement", 5));
c3p0.setAcquireRetryAttempts(dbCfg.getInt("acquireRetryAttempts", 30));
c3p0.setMaxStatements(dbCfg.getInt("maxStatements", 0));
异常信息:
c3p0: An idle resource is broken and will be purged.
c3p0 [broken resource]: java.lang.NullPointerException
c3p0: An idle resource is broken and will be purged.
c3p0: An idle resource is broken and will be purged.
c3p0 [broken resource]: c3p0 [broken resource]:  at com.mchange.v2.c3p0.impl.NewProxyDatabaseMetaData.getTables(NewProxyDatabaseMetaData.java:2827)
at com.mchange.v2.c3p0.impl.DefaultConnectionTester.activeCheckConnection(DefaultConnectionTester.java:71)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1.testPooledConnection(C3P0PooledConnectionPool.java:141)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1.refurbishIdleResource(C3P0PooledConnectionPool.java:126)
at com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask.run(BasicResourcePool.java:1227)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:354)

解决方案 »

  1.   

    <property   name="show_sql">false</property> 
    <property name="hibernate.connection.provider_class">
    org.hibernate.connection.C3P0ConnectionProvider</property>
    <property name="hibernate.c3p0.min_size">8</property>
    <property name="hibernate.c3p0.max_size">200</property>
    <property name="hibernate.c3p0.timeout">600</property>
    <property name="hibernate.c3p0.max_statements">0</property>
    <property name="hibernate.c3p0.idle_test_period">60</property>
    <property name="hibernate.c3p0.acquire_increment">2</property>
    <property name="hibernate.c3p0.validate">true</property>c3p0配置
      

  2.   

    //空闲时是否验证, 若不通过断掉连接, 前提是空闲对象回收器开启状态 
    bds.setTestWhileIdle(true);
    // 以毫秒表示空闲对象回收器由运行间隔。值为负数时表示不运行空闲对象回收器    
    // 若需要回收, 该值最好小于 minEvictableIdleTimeMillis 值    
    bds.setTimeBetweenEvictionRunsMillis(10000);
    //# 1000*60*3 : 被空闲对象回收器回收前在池中保持空闲状态的最小时间, 毫秒表示    
    //# 若需要回收, 该值最好小于DB中的 wait_timeout 值 
    bds.setMinEvictableIdleTimeMillis(180000);我要测试是不过三分钟就会自动回收空闲的连接,所以没有close。
      

  3.   

    DB中的 wait_timeout 值 
    这个要注意哦!数据库会关闭连接的哦!
      

  4.   

    http://blog.csdn.net/jinchun1234/archive/2009/06/21/4286276.aspx