web-dev-qa-db-ja.com

接続com.mysql.jdbc.JDBC4Connection@11d08960でトリガーされる接続リークを軽減するにはどうすればよいですか。

トピックからサブスクライブするリクエストを取得するmqttクライアントがあり、それを固定サイズ50のスレッドプールに渡します。DBプーリングMySQLデータベースにhikaricp2.4.2を使用しています。

私は現在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.getConnection(DataSource.Java:69)at com.database.AccessDatabase.create_alert(AccessDatabase.Java:3849)at com.runnable.StartTaskRunnable2.execute(StartTaskRunnable2.Java:78)で検出されました

これは正常ですか?これを捕まえる必要がありますか?

8
david

私は自分のコードを何度も何度も見直してきました。間違った木に吠えていることに気づきました。接続リークに関しては、ひかりは非常に信頼できるようです。問題は、Amazon aws ec2インスタンスが私のCPUの一部を盗んでいて、私が思っていたよりもさらに大きい場合です。したがって、CPUが99%上昇した後、コードがfinallyブロックで明らかに閉じていても、接続リークが検出されます。したがって、問題はマシンにあります。

参加してくださった皆様、ありがとうございました。

9
david

'stack trace'を使用してコードをウォークスルーすると、閉じられていない接続またはしきい値よりも時間がかかる接続が発生します。

4
Nitin