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:長い接続時間データベースを設定します。
一緒にハオの合計を解析し、給与の合計をありがとうございます。