1. ホーム
  2. ジャワ

ドルイド新バージョンエラー破棄長い時間なし受信接続を解決する。

2022-03-02 06:04:20
<パス

ナビゲーション

問題現象

druidバージョン1.2.1を使用しているのですが、再度開発するとコンソールに必ず時々段落が表示されます。

 discard long time none received connection. jdbcUrl : xxxx


見るのがめんどくさいので、非主流派の無責任精神で、ネットで原因を探ってみると.........。

原因

Webでいろいろ検索した結果、何が問題なのかがわかり、ソースコードを見ました。
com.alibaba.druid.pool.DruidAbstractDataSource で、DruidAbstractDataSource を使用します。

if (valid && isMySql) { // unexcepted branch
    long lastPacketReceivedTimeMs = MySqlUtils.getLastPacketReceivedTimeMs(conn);
    if (lastPacketReceivedTimeMs > 0) {
        long mysqlIdleMillis = currentTimeMillis - lastPacketReceivedTimeMs;
        if (lastPacketReceivedTimeMs > 0 //
                && mysqlIdleMillis >= timeBetweenEvictionRunsMillis) {
            discardConnection(holder);
            String errorMsg = "discard long time none received connection. "
                    + ", jdbcUrl : " + jdbcUrl
                    + ", version : " + VERSION.getVersionNumber()
                    + ", lastPacketReceivedIdleMillis : " + mysqlIdleMillis;
            LOG.warn(errorMsg);
            return false;
        }
    }
}


このコードは、大まかに言って、接続が60秒以上アイドル状態である場合、その接続は破棄され(ホルダー)、警告ログが出力されることを意味します。

<ブロッククオート

なぜdruidは接続プールで60秒しかアイドル状態でない接続を破棄するのですか?ウェブ上では、アリはデータベース・サーバーの処理能力を高めようとしているのだと言う人もいます。

ソリューション

druidに設定を追加する:druid.mysql.usePingMethod=false
アイドル接続の検証はmysqlのpingメソッドを使わず、select 1を使うことで、上記のソースコードに入るたびに時間が更新され、60sを超えないようにしようということです。
具体的な方法は2つあります。

  1. ランタイムコンフィグレーション
    I.e. ランタイムパラメータに追加 : ランタイムパラメータに追加 -Ddruid.mysql.usePingMethod=false
  2. クラスファイルの設定
    プロジェクトの DruidConfig クラスに、新しい
    /*
    * Resolve druid log error: discard long time none received connection:xxx
    */
    @PostConstruct
    public void setProperties(){
        System.setProperty("druid.mysql.usePingMethod","false");
    }
    
    
    

ちょっとした反省

問題を最後まで見届けるには、ソースコードを見るのが良い場合が多いのです。