ポートでUDPデータグラムをリッスンするアプリケーションがあります。このポートでリッスンするためにUDPインバウンドチャネルアダプタを使用しています。私のUDPチャネルアダプタは、ThreadPoolTaskExecutorを使用して着信UDPデータグラムをディスパッチするように構成されています。UDPチャネルアダプタの後、私は直接チャネルを使用します。私のチャネルには、サブスクライバーが1つだけ、つまりサービスアクティベーターがあります。
このサービスは、受信メッセージをメモリに保存されている同期リストに追加します。次に、5秒ごとにリストのコンテンツを取得し、MySQLデータベースをバッチ更新する単一のスレッドがあります。
私の問題:
- メッセージの最初のバルクが到着します。ThreadPoolExecutorのスレッドは、UDPチャネルアダプターから着信メッセージを取得し、それらを同期リストに追加します。10000件のメッセージが受信されて挿入されたとしましょう。
- バックグラウンドスレッドは10000メッセージを取得し、バッチ更新を実行します(JdbcTemplate.update(String [])。
- この時点で、バックグラウンドスレッドはデータベースからの応答を待機します。しかし、現在、データベースが10000 INSERTを実行するのに時間がかかるため、20000メッセージが受信され、リストに表示されています。
- バックグラウンドスレッドはデータベースから応答を受け取ります。次に、20000メッセージを取得し、バッチ更新(JdbcTemplate.update(String [])を実行します。
- データベースがINSERTを実行するのにより多くの時間がかかり、この間に35000のメッセージが受信され、リストに保管されました。
ヒープサイズは絶えず大きくなり、一定時間後にメモリの実行を引き起こします。
アプリケーションのパフォーマンスを改善するための解決策を見つけようとしています。
ありがとう