超时等待空闲对象Apache连接池

时间:2012-08-03 06:48:01

标签: java mysql apache connection-pooling

我使用ConnectionPool创建了一个Pool,如下所示:

我从数据库创建了一些来自getConection的tak并执行它们。我只运行我的应用程序3次,我的应用程序抛出异常。

PoolableObjectFactory mySqlPoolableObjectFactory = new MySqlPoolableObjectFactory(
            host, dbName, user, password);
    Config config = new GenericObjectPool.Config();
    config.maxActive = 10;
    config.testOnBorrow = true;
    config.testWhileIdle = true;
    config.maxIdle = 5;
    config.minIdle = 1;
    config.maxWait = 10000;
    config.timeBetweenEvictionRunsMillis = 10000;
    config.minEvictableIdleTimeMillis = 60000;

    GenericObjectPoolFactory genericObjectPoolFactory = new GenericObjectPoolFactory(
            mySqlPoolableObjectFactory, config);
    return genericObjectPoolFactory.createPool();

public Connection getConnectionFromPool() {

    Connection conn = null;

    try {

        conn = (Connection) connPool.borrowObject();

    } catch (Exception e) {

        e.printStackTrace();

    }

    return conn;
}

但是当我运行很多线程时。它抛出了Exeption

java.util.NoSuchElementException: Timeout waiting for idle object
    at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1174)
    at vn.vccorp.bigdata.mysql.AdmarketPool.getConnectionFromPool(AdmarketPool.java:76)

2 个答案:

答案 0 :(得分:4)

 config.maxWait = 10000;
 config.timeBetweenEvictionRunsMillis = 10000;
config.minEvictableIdleTimeMillis = 60000;

这些设置组合起来没有意义。您只需等待10秒即可进行池化输入,但您只需每10秒钟将其驱逐一次。驱逐需要比这更频繁地发生。这些的默认值分别为30秒和5秒。

答案 1 :(得分:2)

我检查了我的代码,在某些情况下我错过了returnObject。谢谢安德烈·鲍里索夫