20分には殺人を引き起こしたドルイド接続時間

1.問題の説明

問題をぶら下げたときにデータの大きなバッチが時々発生し、実稼働環境。(3既定のタスクのスケジューリング規則的な時間による分、時には定期的なタスクを開始しますが、何のビジネスデータを処理していません)。ハンギングバッチは、ビジネスの多くは搾り発生し処理していません。今回は、手動ハンドルに人を必要としています。

2.分析

2.1バグ反射経路解析

JobDetail#実行
/ **このコードは、最初の決定何の状態のバッチは、直接返し呼び出さないビジネス・ロジック・コードを処理後、実行している場合* /実行されているかどうか
IF(RUNNING.equals(taskInfo.getStatus())){
    logger.info(taskInfo.getId()getTaskKey()+ "が実行されています...");
} そうしないと {
    //ビジネスロジックコード
    (コンテキスト、タスク、taskInfo)を実行します。
    log.info( "ジョブのexecエンド" + DataUtil.now())
    updateJobDb(タスク)。
}

2.2Bug分析

強く合計の構成は、ドルイドはremoveAbandonedTimeoutをが設けられた接続プール1200を見つけたドルイドことが示唆されました。

設定の説明:回復時間の制限を超えているかどうかをremoveAbandonedTimeoutを。

強力に基づいてお奨め分析は、私たちは、ソースコードを解析し、その後。単にライブ接続プールを保持しますドルイドされます。

com.alibaba.druid.pool.DruidDataSource#getConnectionDirect
/ ** *最大時間データベース接続を設定します/
公共DruidPooledConnectionのgetConnection(長いmaxWaitMillis)はSQLExceptionが{スロー
        this.init();
        IF(this.filters.size()> 0){
            FilterChainImplれるFilterChainは、新しいFilterChainImpl(これを)=。
            filterChain.dataSource_connect(これ、maxWaitMillis)を返します。
        } そうしないと {
            リターンthis.getConnectionDirect(maxWaitMillis)。
        }
}
後/ **残業はちょうどここに、ソースコードの一部を接続しているあきらめて、見て、自分の研究に興味のあるフル* /
公共INT removeAbandoned(){
      
        DruidPooledConnectionのPooledConnection;
        {試します
            ITER = this.activeConnections.keySet()イテレータを()。

            一方、(iter.hasNext()){
                PooledConnection =(DruidPooledConnection)iter.next();
                (もし!pooledConnection.isRunning()){
                    長いtimeMillis =(currrentNanos  -  pooledConnection.getConnectedTimeNano())/ 1000000L。
                    IF(timeMillis> = this.removeAbandonedTimeoutMillis){
                        iter.remove();
                        pooledConnection.setTraceEnable(偽);
                        abandonedList.add(のPooledConnection)。
                    }
                }
            }
        } 最後に {
            this.activeConnectionLock.unlock();
        }
    }

2.3バグ再現

    上記の分析によると、我々はそれがそうであるかどうかを確認するために、手動sleep20分を使用しました。
    テンプレート(1)は3つのデータ、sleep19分を作りました
    テンプレート(2)2つのデータ、sleep20分を送信
終了時刻を開始したシリアル番号    
2020年1月9日夜02時18分40秒23
2020年1月9日午後2時18分30秒22
2020年1月9日午後2時13分10秒2020年1月9日夜02時18分01秒21
2020年1月9日夜1時57分50秒2020年1月9日夜02時18分01秒20
2020年1月9日午後01時57分40秒2020年1月9日午前14時18分○○秒18
2020年1月9日午後1時51分25秒2020年1月9日夜01時57分24秒17
2020年1月9日午後01時51分20秒2020年1月9日午前13時57分23秒16
2020年1月9日夜01時50分40秒2020年1月9日午後01時57分21秒15
2020年1月9日夜01時31分01秒2020年1月9日夜01時47分11秒14
2020年1月9日夜1時28分20秒2020年1月9日夜1時47分10秒13
2020年1月9日夜01時13分09秒2020年1月9日夜01時13分14秒12

3.問題解決

方法:長い処理ライン上の20分ほど、より小さなデータ処理。

方法2:長い接続時間データベースを設定します。

 

一緒にハオの合計を解析し、給与の合計をありがとうございます。

彼は182元記事に公開 ウォン称賛45 ビューに25万+を

おすすめ

転載: blog.csdn.net/u014172271/article/details/103946347