私は何年もの間この問題と戦ってきましたが、私の人生では問題が何であるかを理解することはできません. 使用しているスタックのステージを設定しましょう。
- Web ベースの Java 8 アプリケーション
- GWT
- 休止状態 4.3.11
- MySQL
- モンゴDB
- 春
- Tomcat 8 (たとえば、C3PO の代わりに Tomcat 接続プーリングを含む)
- Hibernate Search / Lucene
- Terracotta と EhCache
問題は、数日おき (場合によっては 2 日おき、場合によっては 10 日に 1 回、場合によって異なります) の早朝に、アプリケーションが「ロックアップ」することです。明確にするために、それはクラッシュしません。ログインすることも、そのことについて何もすることもできません。すべてのバックグラウンド タスク - すべて - が停止します。この状態でログインしようとすると、ログ ファイルで、有効なユーザーとして認証されていることを確認できますが、応答が送信されないため、アプリケーションは単に「スピン」します。
これらの「ロックアップ」がいつ発生するかに関してこれまでに発見された唯一のパターンは、朝のスケジュールされたタスクまたは SAP インポートが実行されているときに発生することです。ただし、実行中のプロセスが常に同じとは限りません。SAP インポートの 1 つや、内部でスケジュールされたタスクの実行中にロックアップが発生することがあります。これらに共通するのは、営業時間外 (午前 1 時から午前 6 時の間) に実行されることと、非常に集中的なプロセスであることです。
監視に JavaMelody を使用していますが、この午前 1 時から午前 6 時までのさまざまな時間帯に、使用される jdbc 接続の数が急増し始めることが毎回わかります (添付の画像を参照)。それが開始されると、ロックアップが発生するのは時間の問題であり、それを解決する唯一の方法は、Tomcat をバウンスしてアプリケーションを再起動することです。
私が知る限り、ロックアップが発生したときにメモリ、CPUなどはすべて問題ありませんが、問題があるように見えるのは、使用されるjdbc接続の数が絶えず増加していることだけです。
私はトランザクション管理のコードを何度もチェックして、トランザクションが正しく終了していることを確認しました (トランザクション管理コードはかなり古風です: try ブロックで明示的な開始とコミット、catch ブロックでロールバック、finally でエンティティ マネージャーを閉じます)。ブロック)。それはすべて私には正しいように見えるので、私は本当に、本当に困惑しています. これに加えて、最近、Hibernate 接続解放モードを after_transaction に適切に明示的に構成しましたが、問題は引き続き発生します。
もう 1 つの奇妙な点は、異なるクライアントに対して同じアプリケーションの複数のインスタンスを実行することです。この問題は、1 つのクライアントに対してのみ定期的に発生します。彼らは私たちのクライアントであり、処理するデータが圧倒的に多く、すべてのクライアントがこれらのスケジュールされたタスクを実行しますが、SAP インポートを使用するのはこの大規模クライアントだけです。そのため、最初は SAP のインポートが問題だと思っていましたが、今朝の午前 1 時過ぎにハングアップし、インポートが開始される数時間前でした。この場合、内部でスケジュールされたタスクの実行中にロックされました。
この奇妙な動作を引き起こしている原因を知っている人はいますか? 私は考えられるすべてを調べましたが、役に立ちませんでした。