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

4
我使用ConnectionPool创建了一个连接池,像这样:

我创建一些任务从数据库中获取连接并执行它们。我只运行了我的应用程序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;
}

但是当我运行多个线程时,它会抛出异常。

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)

3
你是否使用returnObject方法将对象返回到池中? - Andrey Borisov
是的,我总是在使用完我的SQL后关闭连接,使用以下公共void safeClose(Connection conn){如果(conn!= null){尝试{connPool.returnObject(conn);} catch(Exception e){e.printStackTrace();}}}} - phuongdo
2个回答

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

这些设置在组合时没有意义。您只会等待10秒钟来获取池化条目,但您每10秒才驱逐它们一次。驱逐需要比这更频繁地发生。它们的默认值分别为30秒和5秒。


DBCP连接池和Datanucleus一直是我必须调试的最糟糕的事情之一。我遇到了很多问题,花费了很多时间在commons-pool源代码中挖掘,却一无所获。 timeBetweenEvictionRunsMillis 是我面临的所有问题的根源。非常感谢您提供这个指针! - sbrk
我将 datanucleus.connectionPool.maxPoolSize 设置为100,即使有10个并行进程,我仍然面临“等待空闲对象超时”的问题。你知道这是什么原因吗?我原本以为只要进程数小于最大池大小就不会有任何问题,但在我删除了之前设置为70秒的 timeBetweenEvictionRunsMillis 后问题消失了。 - sbrk

2

我检查了我的代码,发现在某些情况下我错过了returnObject。谢谢 Andrey Borisov


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接