如何缓解连接 com.mysql.jdbc.JDBC4Connection@11d08960 触发的连接泄漏,
How do I mitigate Connection leak triggered for connection com.mysql.jdbc.JDBC4Connection@11d08960,
我有一个 mqtt 客户端正在获取主题订阅请求,
然后我把它交给固定大小 50 的线程池。
我将 hikaricp 2.4.2 用于数据库池 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");
这是完整的日志消息:
警告日志:
811439 [Hikari housekeeper (pool HikariPool-0)] WARN
com.zaxxer.hikari.pool.ProxyLeakTask - Connection leak detection
triggered for connection com.mysql.jdbc.JDBC4Connection@11d0896, stack
trace follows java.lang.Exception: Apparent connection leak detected
at com.hcpdatabase.DataSource.getConnection(DataSource.java:69)
at com.database.AccessDatabase.create_alert(AccessDatabase.java:3849)
at com.runnable.StartTaskRunnable2.execute(StartTaskRunnable2.java:78)
这正常吗?我必须抓住这个吗?
使用 'stack trace' 遍历代码,它会导致您未关闭连接或连接时间超过阈值。
因为我一遍又一遍地检查我的代码。我开始意识到我在错误的树上吠叫,似乎 hikari 在连接泄漏方面非常可靠。问题是亚马逊 aws ec2 实例正在窃取我的一些 cpu 并且比我想象的还要大。因此,在 cpu 上升 99% 后,即使我的代码在 finally 块中明确关闭了它,也会检测到连接泄漏。所以是机器的问题
感谢所有参与回答的人。
我有一个 mqtt 客户端正在获取主题订阅请求, 然后我把它交给固定大小 50 的线程池。 我将 hikaricp 2.4.2 用于数据库池 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");
这是完整的日志消息:
警告日志:
811439 [Hikari housekeeper (pool HikariPool-0)] WARN com.zaxxer.hikari.pool.ProxyLeakTask - Connection leak detection triggered for connection com.mysql.jdbc.JDBC4Connection@11d0896, stack trace follows java.lang.Exception: Apparent connection leak detected at com.hcpdatabase.DataSource.getConnection(DataSource.java:69) at com.database.AccessDatabase.create_alert(AccessDatabase.java:3849) at com.runnable.StartTaskRunnable2.execute(StartTaskRunnable2.java:78)
这正常吗?我必须抓住这个吗?
使用 'stack trace' 遍历代码,它会导致您未关闭连接或连接时间超过阈值。
因为我一遍又一遍地检查我的代码。我开始意识到我在错误的树上吠叫,似乎 hikari 在连接泄漏方面非常可靠。问题是亚马逊 aws ec2 实例正在窃取我的一些 cpu 并且比我想象的还要大。因此,在 cpu 上升 99% 后,即使我的代码在 finally 块中明确关闭了它,也会检测到连接泄漏。所以是机器的问题
感谢所有参与回答的人。