0

次の部分を持つWebアプリケーションがあります。

  1. コメンテーターは、ブラウザー ベースのツールを使用して試合の解説を継続的に行っています。コメントは、hibernat を使用して DB に挿入されます。

  2. 多くのユーザーが URL にアクセスして解説を読んでいます。Hibernate は、ステップ #1 でコメンテーターによって更新されたテーブルからデータを読み取っています。

  3. 1 時間ごとに実行するように設定されているストアド プロシージャもいくつかあります。それらのほとんどは、読み取りと書き込み/更新の目的で同じテーブル (ステップ #1 と #2 で使用) にアクセスします。

今私の問題は、サイトに 100 人以上の同時ユーザーが特定の試合の解説を見ているときはいつでも、MySQL がダウンすることです。プロセスリストにたくさんのクエリが残っていることを示しています。それらの多くは「一時テーブルにコピー中」状態にあります。これにより、JBOSS が頻繁に再起動します。

読み取りと書き込みの両方の目的で、休止状態でトランザクションを使用しています。これらのクラッシュのために大きな試合を失うので助けてください.

4

1 に答える 1

1

パフォーマンスに問題があります。常に機能するソリューションを提供することは困難です。あなたができると考えられることは次のとおりです。

1) HQL (Hibernate) ステートメントを修正します。<property name="show_sql">true</property>これを行うには、構成ファイル (または、実際のパラメーターを表示する場合は log4jdbc などのツール) でプロトコルを記述し、出力を分析します。そこには、どの SQL リクエストが最も多いかが表示されます。多くの場合、db データの読み取りと書き込みの戦略を改善することで、データベース トラフィックを大幅に削減できます。そして、テーブルに適切なインデックスがあることを確認してください。

2) 二次キャッシュの使用を検討してください。(通常、hibernate は第 1 レベルのキャッシュのみを使用します。これは、1 つのセッションにバインドされているため、この場合は役に立ちません。)その後、少なくとも実際のコメントを読み取るための要求はキャッシュによって処理され、に移動する必要はありません。データベース。(注意: キャッシュはストアド プロシージャに干渉する可能性があります。使用したいキャッシュ製品が MySQL ストアド プロシージャをサポートしているかどうかを確認してください。最悪の場合、重要なテーブルのストアド プロシージャを削除し、アプリケーション サーバーに任せる必要があります。ジョブがキャッシュを通過するようにします)。

3) 使用頻度の高いテーブルが数個しかない場合は、アプリケーションでそれらをキャッシュすることを検討できます。それはより多くの作業ですが、おそらくアプリケーションの要求に合わせて正確に行うことができるため、一般的な第 2 レベルのキャッシュよりも高速になる可能性があります。

4) 何も解決せず、トラフィックが非常に重い場合は、ハードウェアを追加する必要があります。

幸運を ;-)

于 2012-06-05T09:12:44.697 に答える