2

我正在使用 DBCP2 BasicDataSource 来管理数据库连接。当我测试时,我使用 getNumActive() 和 getNumIdle() 打印出池状态。我最终活动连接不断增加,而空闲连接始终为 0。

这是我的代码:

    public static Connection getCnn() throws Exception {
    Connection cnn = null;
    if (ds.isClosed()){
        init();
        logger.warn("DataSource is closed. Rebuild BasicDataSource from getCnn");
    }
    logger.trace("Request for connection");
    cnn = ds.getConnection();
    // Monitor current connecton pool 
    // change to logger.trace in future for performance.
    logger.warn("Current Connection Pool: " 
        + "\n MaxTotal of connection - " + String.valueOf(maxTotal)
        + "\n Number of active connection - " + String.valueOf(ds.getNumActive())
        + "\n Number of idle connecton - " + String.valueOf(ds.getNumIdle()));
    return cnn;

我的 BasicDataSource 配置是

   MinIdle = "8"
   MaxIdle = "16"
   MaxTotal = "-1"
   maxOpenPreparedStatements = "256"
   RemoveAbandonedTimeout = "300"
   RemoveAbandonedOnBorrow = "true"

并且输出是空闲连接数始终为0,无论我等待连接空闲多长时间,活动连接都会不断增加。

那么在什么情况下连接会变成“空闲”呢?我找不到任何超时设置来强制连接空闲。

任何见解将不胜感激!

4

1 回答 1

1

我不确定您是否正在关闭连接对象。一旦你关闭你的连接对象,活动连接将减少,空闲连接将增加。

当您执行“ds.getConnection()”时,将创建一个连接(对象),或者检索已关闭的已创建连接(对象)然后返回。收到的连接对象被认为是活动的,直到调用关闭。准备好被重用的已关闭连接对象是空闲连接。

于 2020-04-02T07:45:49.247 回答