1. ホーム
  2. java

[解決済み] 光プール LeakDetectionThreshold で検出された接続漏れ

2022-02-14 22:55:01

質問

私は光接続プールを持っており、以下のように設定されています。

    HikariConfig hikariConfig = new HikariConfig();
    hikariConfig.setJdbcUrl(dbProps.getUrl());
    hikariConfig.setUsername(dbProps.getUser());
    hikariConfig.setPassword(dbProps.getPass());
    hikariConfig.addDataSourceProperty("cachePrepStmts", "true");
    hikariConfig.addDataSourceProperty("prepStmtCacheSize", "250");
    hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
    hikariConfig.setMaximumPoolSize(Runtime.getRuntime().availableProcessors() * 5 + 2);
    hikariConfig.setIdleTimeout(36000);
    hikariConfig.setConnectionTestQuery("SELECT 1;");
    hikariConfig.setConnectionTimeout(20000);
    hikariConfig.setMaxLifetime(1440000);
    hikariConfig.setLeakDetectionThreshold(3000); // LEAK DETECTION THRESHOLD
    dataSource = new HikariDataSource(hikariConfig);

そして、いくつかのDBの詳細が以下のように取得されます。

public class SomeDBFetcher {

private DataSource dataSource;

public SomeDBFetcher(final DataSource dataSource) {
    this.dataSource = dataSource;
}

public void someMethod() {
    try (final var conn = dataSource.getConnection(); // CONNECTION LEAKS ?
        final var stmt = conn.prepareStatement("SOME QUERY")) {
        // SOME DB
    }
}

}

ログを見ると、コネクションリークが発生しています。なぜ接続漏れが発生するのでしょうか?

解決方法を教えてください。

LeakDetectionThreshold は、定義された制限時間(あなたの場合は3秒)内に接続を閉じないと、潜在的なリークが発生することを通知します。

ここでは、おそらくクエリ(またはその内部の何か)を使用しています。 try を使用した場合、3秒以上かかり、接続漏れの可能性があると警告されます。

ですから、このような警告が表示されても、実際に漏電しているとは限りません。

ドキュメントより。

<ブロッククオート

リーク検知閾値
このプロパティは、接続漏れの可能性を示すメッセージが記録される前に、接続がプールから外れることができる時間の長さを制御します。値0は、リーク検出が無効であることを意味します。リーク検出を有効にするための許容最小値は、2000 (2秒) です。デフォルト:0

https://github.com/brettwooldridge/HikariCP