Почему DBCP getNumIdle всегда возвращает 0? Когда активное соединение становится бездействующим?

Я использую 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, и активное соединение продолжает увеличиваться независимо от того, как долго я жду, пока соединение не станет бездействующим.

Итак, в каком состоянии соединение станет «бездействующим»? Я не могу найти никаких настроек тайм-аута, чтобы принудительно перевести соединение в режим ожидания.

Любые идеи будут высоко оценены!


person Roger Guo    schedule 23.11.2016    source источник


Ответы (1)


Я не уверен, что вы закрываете объект подключения. Как только вы закроете свой объект соединения, активное соединение уменьшится, а число незанятых соединений увеличится.

Когда вы выполняете "ds.getConnection()", создается соединение (объект) или уже созданное соединение (объект), которое закрыто, извлекается и затем возвращается. Полученный объект соединения считается активным до тех пор, пока не будет вызвано закрытие. Объекты закрытого соединения, которые готовы к повторному использованию, являются незанятыми соединениями.

person Adhil Roshan    schedule 02.04.2020