0

2つの問題で私を助けてくれませんか:

A.読み取りと書き込みの操作が同時に行われるテーブルがあります。書き込みは非常に広範囲に発生するため、読み取りは非常に遅くなります。このテーブルでの大量の書き込み操作が原因で、Webアプリケーションが起動しない場合があります。このようなシナリオをどのように処理できますか。書き込みは別のJavaアプリケーションを介して行われ、読み取りはWebアプリケーションを介して行われるため、Webアプリケーションは非常に遅くなります。何か案が?

B.このテーブルへの書き込みは200スレッドで発生し、これらのスレッドは接続プールから接続を取得してテーブルに書き込み、このアプリケーションは24時間365日実行されます。スレッドの優先度に問題があり、Webアプリケーションからの読み取り操作を停止しています。

C.そのテーブルに対してのみマスターマスターレプリケーションを実行できますか?つまり、書き込みは1つのテーブルで行われ、書き込みは別のテーブルで行われ、2分ごとにデータが1つのテーブルから別のテーブルに移行されますか?

私に提案してください。

前もって感謝します。

4

3 に答える 3

0

これを解決する1つの真の方法は、書き込みイベントのキューを使用し、定期的に書き込みを停止して、リーダーにチャンスを与えることです。

  1. 着信書き込み更新のキューを作成します
  2. ロックとして使用するatomicXXX(java.util.concurrencyを参照)を作成します
  3. キューから読み取り、ロックが解除されたときに更新を実行するスレッドプールを作成します
  4. javax.swing.Timerを使用して、定期的にロックを設定し、テーブルデータを読み取ります。
于 2012-04-22T15:23:04.717 に答える
0

複雑すぎることを試す前に、おそらくこれを試してください。

1)スレッドの優先順位を使用しないでください。スレッドの優先順位が必要になることはめったにありません。

2)読み取​​りと書き込みの両方に(優先)キューを設定し、読み取りが優先されるようにすることで、独自の優先度スキームを設定します。つまり、読み取りおよび書き込み要求を単一のキューに追加し、それらをブロックするか、結果を通知します。

3)データベース機能をチェックして、書き込みの多いテーブルを最適化します

于 2012-04-22T15:35:58.753 に答える
0
  1. 接続プールのサイズを確認してください-おそらくそれは小さすぎて、スレッドはプールからの接続を待つ時間を無駄にします。
  2. データベースの設定を確認してください。すぐに使用できるパラメータを使用して実行するだけの場合は、改善の余地があるかもしれません。
  3. おそらく、何らかのイベント駆動型システムが必要です。車両がデータを送信する場合、DBは更新されませんが、メッセージがキュー(JMSなど)に追加されます。次に、アプリは起動時にデータをキャッシュし、このメッセージを受信するとキャッシュとデータベースの両方を更新します。重要なのは、DBと対話する唯一のコンポーネントはアプリであり、データはイベントを受信したときにのみ変更されるため、データを読み取るためにDBにクエリを実行する必要はありません。さらに、わずかなデータを使用してバックグラウンドで更新を行うことができます。スレッドなど。非常に優れたオープンソースメッセージングシステム(Apache Active MQなど)とキャッシングライブラリ(EH Cacheなど)があるため、それほど労力をかけずに、適度にパフォーマンスが高く、障害に強いシステムを構築できます。
  4. メッセージングの導入は深刻なリエンジニアリングになると思います。そのため、当面の問題を解決するには、レプリケーションが最善の解決策になる可能性があります。更新可能なテーブルから別のテーブルに2分ごとにデータをマージすると、トラッカーはその別のテーブルを読み取ります。Webアプリのデータのみを読み取り、更新しない場合は明らかにうまく機能します。そうでない場合は、2つのテーブルの同期を維持するために多大な労力を費やす必要があります。そのバリエーションはバッチ処理です。車両からのデータは中間テーブルに挿入され、2分ごとにメインテーブルに転送され、そこからリーダーがクエリを実行します。中間テーブルは転送後にクリーニングされます。
于 2012-04-22T16:13:21.410 に答える