Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何缓解连接com.mysql.jdbc触发的连接泄漏。JDBC4Connection@11d08960,_Java_Mysql_Jdbc_Memory Leaks_Hikaricp - Fatal编程技术网

Java 如何缓解连接com.mysql.jdbc触发的连接泄漏。JDBC4Connection@11d08960,

Java 如何缓解连接com.mysql.jdbc触发的连接泄漏。JDBC4Connection@11d08960,,java,mysql,jdbc,memory-leaks,hikaricp,Java,Mysql,Jdbc,Memory Leaks,Hikaricp,我有一个mqtt客户端从主题获取请求订阅, 然后我把它交给固定大小为50的线程池。 Im使用hikaricp 2.4.2作为数据库池MySQL数据库 我目前正在使用2.4.2,这是我的设置 HikariConfig config = new HikariConfig(); config.setDataSourceClassName(CLASS_FOR_NAME); config.setJdbcUrl(HOST); config.setUsername(USER);

我有一个mqtt客户端从主题获取请求订阅, 然后我把它交给固定大小为50的线程池。 Im使用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管家池HikariPool-0]警告 com.zaxxer.hikari.pool.ProxyLeakTask-连接泄漏检测 已为com.mysql.jdbc连接触发。JDBC4Connection@11d0896堆栈 跟踪遵循java.lang.Exception:检测到明显的连接泄漏 位于com.hcpdatabase.DataSource.getConnectionDataSource.java:69 在com.database.AccessDatabase.create_alertAccessDatabase.java:3849 位于com.runnable.StartTaskRunnable2.executeStartTaskRunnable2.java:78


这正常吗?我必须抓住这个问题吗?

用“堆栈跟踪”遍历代码,它会导致您连接未关闭或连接时间超过阈值。

因为我已经一遍又一遍地查看了我的代码。我开始意识到,我是在错误的树吠叫,似乎hikari是非常可靠的,当谈到连接泄漏。问题是AmazonAWSEC2实例占用了我的一些cpu,甚至比我想象的还要大。因此,在cpu上升99%后,即使我的代码在finally块中清楚地关闭了连接,也会检测到连接泄漏。所以问题出在机器上


我感谢所有参与回答的人

嗯,这要看情况了,你想不想漏接?为什么不给我们看看你的DataSource类,你知道检测到泄漏的那个。你正在关闭连接吗?是的,实际上有时候一秒钟内有30个事务的突发事务,我想这就是为什么它不是线程安全的原因。我总是使用try{}finally{//closing connection here}一直以来,我从来没有说过任何关于线程安全的事情。连接泄漏是一件非常简单的事情,您检查了一个连接,但从未关闭它,即将其返回到池中。如果在任何地方都使用try/finally或try-with-resources,则应该不会出现连接泄漏。问题似乎是后者,我已通过从config.setConnectionTestQuery/*ping*/更新我的连接测试查询修复了它;到这个config.setConnectionTestQuery/*ping*/选择1;现在我还没有看到任何100多秒的休眠连接。测试查询需要100多秒!奇怪的您的问题已经有config.setConnectionTestQuery/*ping*/SELECT 1;然而好消息是,如果查询以/*ping*/开头,并且区分大小写,那么连接器/J驱动程序可以对服务器执行轻量级ping,而不是执行语句。不,我的意思是,100秒以上的空闲/休眠连接实际上是泄漏连接,因为我已经将连接设置为在不到90秒的时间内断开。您在哪里设定90秒?是120!来自问题:config.setMaxLifeTimeUnit.MINUTES.toMillis2;//120秒config.setIdleTimeoutTimeUnit.MINUTES.toMillis1;//分钟是最长的生命时间,如果它空闲的话,它只有一分钟。我不知道为什么我在这里观察到>80和小于90,你说amazon aws ec2实例偷走了我的一些cpu是什么意思?@AravindhRS