我有一个 mqtt 客户端从主题获取订阅请求,
然后我把它交给固定大小 50 的线程池。
我使用 hikaricp 2.4.2 作为 DB Pooling MySQL 数据库。
我目前使用 2.4.2,这是我的设置
HikariConfig config = new HikariConfig();
config.setDataSourceClassName(CLASS_FOR_NAME);
config.setJdbcUrl(HOST);
config.setUsername(USER);
config.setPassword(PASS);
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
config.setLeakDetectionThreshold(TimeUnit.SECONDS.toMillis(30));
config.setValidationTimeout(TimeUnit.MINUTES.toMillis(1));
config.setMaximumPoolSize(10);
config.setMinimumIdle(0);
config.setMaxLifetime(TimeUnit.MINUTES.toMillis(2)); // 120 seconds
config.setIdleTimeout(TimeUnit.MINUTES.toMillis(1)); // minutes
config.setConnectionTimeout(TimeUnit.MINUTES.toMillis(5));
config.setConnectionTestQuery("/* ping */ SELECT 1");
这是完整的日志消息:
WARNLOG:
811439 [Hikari 管家 (池 HikariPool-0)] 警告
com.zaxxer.hikari.pool.ProxyLeakTask - 连接泄漏检测
触发连接 com.mysql.jdbc.JDBC4Connection@11d0896,堆栈
跟踪遵循 java.lang.Exception:检测到明显的连接泄漏
在 com.hcpdatabase.DataSource.getConnection(DataSource.java:69)
在com.database.AccessDatabase.create_alert(AccessDatabase.java:3849)
在 com.runnable.StartTaskRunnable2.execute(StartTaskRunnable2.java:78)
这是正常的吗?我必须抓住这个吗?
因为我一遍又一遍地检查我的代码。我意识到我是对着错误的树吠叫,看来 hikari 在连接泄漏方面非常可靠。问题是当亚马逊 aws ec2 实例窃取我的一些 cpu 并且比我想象的还要大。因此,在 cpu 上升 99% 后,即使我的代码明确在 finally 块中关闭了连接泄漏,也会检测到连接泄漏。所以问题出在机器上。
我感谢所有参与回答的人。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)