我正在尝试测试空闲连接行为。我希望我的代码在这里遇到异常,但它没有:
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分钟、minimumIdle
〈maximumPoolSize
并且禁用了keepalive和leakdetection阈值的情况下,此连接应该无法执行executeQuery
函数(这是一个简单的选择查询),但它确实成功运行到完成。
我错过了什么?
1条答案
按热度按时间2skhul331#
您误解了HikariCP中
idleTimeout
的含义:* “此属性控制允许连接在池中处于空闲状态的最长时间。".您的连接在池中不处于空闲状态:你的代码已经 checkout 了它,所以它正在使用。maxLifeTime
也是一样: ”正在使用的连接永远不会退出,只有当它关闭时才会被删除。"*(引用文本来自HikariCP,配置(旋钮,宝贝!))HikariCP没有办法在超时后强制关闭连接,它唯一的功能是
leakDetectionThreshold
,但它只会记录潜在的连接泄漏,不会撤销连接。