如何减轻连接com.mysql.jdbc.JDBC4Connection@11d08960触发的连接泄漏,

时间:2015-11-24 06:39:18

标签: java mysql jdbc memory-leaks hikaricp

我有一个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)

这是正常的吗?我必须抓住这个吗?

2 个答案:

答案 0 :(得分:6)

我一遍又一遍地审查了我的代码。我开始意识到我在错误的树上吠叫,似乎hikari在连接泄漏方面非常可靠。问题是当amazon aws ec2实例正在窃取我的一些cpu并且甚至比我想象的更大。因此,在cpu上升99%之后,即使我的代码在finally块中清楚地关闭它,也会检测到连接泄漏。所以问题在于机器。

感谢所有参与回答的人。

答案 1 :(得分:3)

通过“堆栈跟踪”遍历代码,它将导致您取消关闭连接或超过阈值的连接。