java 为什么HikariCP连接工作后空闲超时

uinbv5nw  于 2023-02-28  发布在  Java
关注(0)|答案(1)|浏览(433)

我正在尝试测试空闲连接行为。我希望我的代码在这里遇到异常,但它没有:

static public void testConnectionDS() throws SQLException {
    HikariDataSource ds = new HikariDataSource();
    ds.setJdbcUrl(Jdbc_URL);
    ds.setUsername(Username);
    ds.setPassword(Password);

    ds.setMaxLifetime(1000 * 60 * 3);
    ds.setMinimumIdle(2);
    ds.setIdleTimeout(1000 * 60 * 2);

    Connection connection = ds.getConnection();     
    
    setupTable(connection);
    try {
        TimeUnit.MILLISECONDS.sleep(ds.getMaxLifetime() + ds.getIdleTimeout() + 1000 * 35); // around 6 miutes
        executeQuery(connection);
    } catch (Exception e) {
        System.out.println(java.time.LocalTime.now() + " : executeQuery Exception: " + e.getMessage());
        e.printStackTrace(System.out);
    }
}

打印各种设置,设置为:

KeepaliveTime:0
MaxLifetime:180,000
IdleTimeout:120,000
minimumIdle:2
maximumPoolSize:10
LeakDetectionThreshold:0

我的系统设置是:

% sysctl -a |grep tcp |grep keep
net.inet.tcp.keepidle: 7200000
net.inet.tcp.keepintvl: 75000
net.inet.tcp.keepinit: 75000
net.inet.tcp.keepcnt: 8
net.inet.tcp.always_keepalive: 0
net.inet.mptcp.keepalive: 840

MaxLifetime为3分钟、IdleTimeout为2分钟、minimumIdlemaximumPoolSize并且禁用了keepalive和leakdetection阈值的情况下,此连接应该无法执行executeQuery函数(这是一个简单的选择查询),但它确实成功运行到完成。
我错过了什么?

2skhul33

2skhul331#

您误解了HikariCP中idleTimeout的含义:* “此属性控制允许连接在池中处于空闲状态的最长时间。".您的连接在池中不处于空闲状态:你的代码已经 checkout 了它,所以它正在使用。maxLifeTime也是一样: ”正在使用的连接永远不会退出,只有当它关闭时才会被删除。"*(引用文本来自HikariCP,配置(旋钮,宝贝!))
HikariCP没有办法在超时后强制关闭连接,它唯一的功能是leakDetectionThreshold,但它只会记录潜在的连接泄漏,不会撤销连接。

相关问题