1

ポートでUDPデータグラムをリッスンするアプリケーションがあります。このポートでリッスンするためにUDPインバウンドチャネルアダプタを使用しています。私のUDPチャネルアダプタは、ThreadPoolTask​​Executorを使用して着信UDPデータグラムをディスパッチするように構成されています。UDPチャネルアダプタの後、私は直接チャネルを使用します。私のチャネルには、サブスクライバーが1つだけ、つまりサービスアクティベーターがあります。

このサービスは、受信メッセージをメモリに保存されている同期リストに追加します。次に、5秒ごとにリストのコンテンツを取得し、MySQLデータベースをバッチ更新する単一のスレッドがあります。

私の問題:

  1. メッセージの最初のバルクが到着します。ThreadPoolExecutorのスレッドは、UDPチャネルアダプターから着信メッセージを取得し、それらを同期リストに追加します。10000件のメッセージが受信されて挿入されたとしましょう。
  2. バックグラウンドスレッドは10000メッセージを取得し、バッチ更新を実行します(JdbcTemplate.update(String [])。
  3. この時点で、バックグラウンドスレッドはデータベースからの応答を待機します。しかし、現在、データベースが10000 INSERTを実行するのに時間がかかるため、20000メッセージが受信され、リストに表示されています。
  4. バックグラウンドスレッドはデータベースから応答を受け取ります。次に、20000メッセージを取得し、バッチ更新(JdbcTemplate.update(String [])を実行します。
  5. データベースがINSERTを実行するのにより多くの時間がかかり、この間に35000のメッセージが受信され、リストに保管されました。

ヒープサイズは絶えず大きくなり、一定時間後にメモリの実行を引き起こします。

アプリケーションのパフォーマンスを改善するための解決策を見つけようとしています。

ありがとう

4

4 に答える 4

3

5秒ごとに10,000レコードを保存することは、どのデータベースでも維持するのに非常に多くのことです。

他のオプションを検討する必要があります

  • 別のデータストア(NoSQLデータストアやフラットファイルなど)を使用します。
  • 書き込みキャッシュを使用するなど、ディスクでの書き込みパフォーマンスが良好であることを確認してください。
  • 複数のディスクまたはSSDドライブを備えたディスクサブシステムを使用します。
于 2012-06-19T13:32:49.537 に答える
2

提案

a。本当に単一の同期リストが必要ですか?リストのグループを作成することはできません。たとえば、データのキーに対してhashCodeを実行して、これらのリスト間で作業を分割するとしますか?

b。リストから情報を読み取るスレッドのスレッドプールを使用できますか(ちなみに、ここではキューを使用します)。このように、大量のバッチ挿入のために1つのスレッドが「スタック」している場合でも、他のスレッドは「ジョブ」を読み取ることができます。 「キューから実行しますか?

c。データベースはアプリケーションと同じマシンで共同ホストされていますか?これにより、パフォーマンスを向上させることができます

d。挿入クエリを投稿できますか?多分誰かがあなたにそれを最適化する方法を提供することができますか?

于 2012-06-19T13:18:31.773 に答える
2

データベース接続プールを使用して、1つのスレッドでコミットを待つ必要がないようにします。次に利用可能な接続を取得して、並列挿入を実行するだけです。

于 2012-06-19T14:13:10.987 に答える
1

SQLServerテーブルで1秒あたり5.000の挿入が維持されますが、それにはかなりの数の最適化が必要でした。以下のヒントのすべてを使用しなかった、いくつかはあなたに役立つかもしれません。

  • http://dev.mysql.com/doc/refman/5.0/en/insert-speed.htmlでMySQLInsertSpeedのドキュメントのヒントを確認してください
  • 挿入プロセスを並列化する
  • 可能であればメッセージを集約します。すべてのメッセージを保存する代わりに、特定のタイプなどの時間枠で受信したメッセージに関する情報を含む行を挿入します。
  • 主キー以外のインデックスまたは外部キーがないようにテーブルを変更します
  • テキストファイルへの書き込みに切り替えます(データベースに本当に必要な場合は、夜間にloaddataバルクファイル挿入にインポートします)
  • 別のデータベースインスタンスを使用して、テーブルのみを提供します
  • ..。
于 2012-06-19T16:06:45.657 に答える