1

私は Web アプリケーションを持っており、クライアントが知りたいと要求しています。

私は2つのアイデアを思いつきました。
私の考えが正しいかどうか検証してもらいたいです。


これらはクライアントの要件です。

誰が: 訪問者は誰
か( 例:
remoteAddress -IP)
訪問者がアクセスした

私のアイデア 1.
SQL クエリを発行して、Web サイトにアクセスしたすべてのユーザーのユーザー アクティビティをログに記録します。訪問者がページへのリンクをクリックすると、Web アプリケーションはユーザー アクティビティをデータベースに書き込み、要求されたページをレンダリングします。
これはユーザーエクスペリエンスに悪影響を与えると思います。余分な作業を行う必要があるため、ページのレンダリングが遅くなる可能性があります。この方法は、あまりにも多くの SQL クエリを発行することになり、最終的には悪い考えになるのでしょうか?

私のアイデア 2.
ユーザーごと、または印刷ボタンのクリックなどのユーザー アクティビティごとに新しいスレッドを開始します。ページのレンダリングは独自の速度で進行し、ロギングはスレッドで個別に行われます。
これにより、スレッドが多すぎる可能性があると思います。これは良い考えですか、それともあまりにも多くのリソースを使用することになりますか?

それらのどれかが良い、現実世界の慣行であるかどうか疑問に思います。より良い方法があれば、共有してください。:)

4

5 に答える 5

2

推奨事項 1: データベース ロギング システムを使用する場合と使用しない場合のアプリケーションのプロファイルを作成します。アーキテクチャの大幅な変更やパフォーマンスのチューニングを行わなくても、DB ロギングがパフォーマンスのニーズを満たすことがわかる場合があります。

スループット要件を維持できるが、ピーク時に時々バックアップすることがわかっている場合は、DB ロギングを単一のスレッドに移動し、 からの同時キューを使用してログ メッセージを渡すことができますjava.util.concurrent。これは、ログ イベントごとに個別のスレッドをフォークするよりもはるかに効率的です。

私の推測では、パフォーマンスの問題が見つかった場合、ボトルネックはデータベースであることがわかります。しかし、それは単なる予感です。長所と短所を見つけるには、独自のセットアップをプロファイルする必要があります。

注: ロギングを有効にした場合と有効でない場合のパフォーマンスを比較するには、起動時にオン/オフのブール値または特定のログ レベルを最終的な静的変数に構成できます。これらの条件が false であることが保証されている場合、 JIT はif (loggingEnabled)orブロックに含まれるすべてのコードを最適化します。if (logLevel > 3)これにより、現在の (非ログ) アプローチをプロファイリングするときにログ コードのパフォーマンス ペナルティを支払うことなく、ログの有無にかかわらず同じコードを実行できます。

于 2013-04-03T05:42:42.523 に答える
0

案1はいいですね。エントリをデータベースに記録するためのユーティリティ メソッドを作成します。したがって、何らかのイベントをログに記録するたびに、このメソッドを呼び出すだけです。サーバー リソースを過度に消費するべきではなく、応答時間が大幅に遅くなることもありません。

于 2013-04-03T05:30:43.160 に答える