10

私たちの顧客は、がオンラインで、私たちが彼らのために書いたカスタムアプリケーションを現在使用しているのか知りたいと思っています。私は彼らとそれについて話し合いました、そしてこれは正確である必要はありません、より多くのゲストが働くでしょう。

したがって、私の考えは、ユーザーアクティビティを決定するための15分の時間間隔です。これを行うためのいくつかのアイデアは次のとおりです。

  1. データベースにアクセスしたり、Webページを要求したりするたびに、最後のアクティビティの日時をユーザーレコードにスタンプします。ただし、これはデータベースを大量に消費する可能性があります。

  2. 私たちのソフトウェアから「オンラインリクエスト」を送信し、応答を探します。これはスケジュールされた間隔で実行でき、受信した各応答の現在の日付と時刻をユーザーレコードにスタンプします。

あなたの考えは何ですか?そして、あなたはこの状況にどのように対処しますか?

明確化

可能であれば、WindowsとWebの両方で同じアーキテクチャを使用したいと思います。複数のユーザーインターフェイスが相互作用する単一のビジネスロジックレイヤーがあります。WindowsまたはWebの場合があります。

Windowsとは、クライアントサーバーを意味します。

明確化

私はn層アーキテクチャを使用しているので、ビジネスオブジェクトはプレゼンテーション層とのすべての対話を処理します。そのプレゼンテーション層は、クライアントサーバーのWindowsアプリケーション、Webアプリケーション、Webサービスなどにフィードしている可能性があります。

それは私たちの顧客、おそらく最大で100人のユーザーのために開発されたので、トラフィックの多いアプリケーションではありません。

4

12 に答える 12

5

私たちの解決策は、「セッション」テーブル (誰がここにいたかを追跡する) に加えて、「トランザクション」テーブル (何が行われたかを追跡する) を維持することです。UPDATE、INSERT、および DELETE 命令はすべて「Transaction」オブジェクトを介して管理され、これらの SQL 命令のそれぞれは、データベース上で正常に実行されると「Transaction」テーブルに格納されます (更新されたテーブルによっては、具体的に一部の表に従い、他を無視します)。この「Transaction」テーブルには、transactiontType (INSERT の場合は I、DELETE の場合は D、UPDATE の場合は U)、transactionDateTime などの他のフィールドと、最終的に誰が命令を送信したかを示す外部キー「sessionId」があります。一部のコードを使用して、誰がいつ何をしたかを特定することさえ可能です (Gus は月曜日に記録を作成し、

このソリューションの長所は次のとおりです。

  1. 「誰が、いつ」を伝え、それをユーザーに見せることができます! (SQL ステートメントを分析するためのコードが必要になります)
  2. データが複製され、複製が失敗した場合は、このテーブルを使用してデータベースを再構築できます

短所は

  1. 1 か月あたり 100,000 のデータ更新は、Tbl_Transaction の 100,000 レコードを意味します
  2. 最後に、このテーブルはデータベース ボリュームの 99% になる傾向があります。

私たちの選択: 90 日以上経過したすべての記録は毎朝自動的に削除されます

于 2008-10-06T18:11:51.010 に答える
2

戦略1が機能するのを見たことがあります。もちろん、その場所は小さなものでした。

于 2008-10-06T13:22:23.497 に答える
1

stackoverflowのようなサイトはどのように機能するのでしょうか?

私がサイトを操作し、自分のプロファイルを見て、 8分前に最後に見たようなことを言っているので、彼らは特定のイベントをターゲットにする必要があります。

于 2008-10-06T15:43:20.433 に答える
0

ログレコードテーブルをデータベースにドロップするだけです。

UserId int FK
アクションchar(3)('in'または'out')
Time DateTime

誰かがログインまたはログアウトしたときにテーブルに新しいレコードをドロップするか、ユーザーの最後のレコードを更新することができます。

于 2008-10-06T13:23:42.447 に答える
0

私はあなたがリストした最初の方法を利用した多くのシステムで作業しましたが、少し注意深く計画することで、実際にはあまり効果がない方法で実行できます。

それはすべて、いつ/どのように/何を追跡しようとしているのかによって異なります。複数のセッションを追跡する必要がある場合、通常、ユーザーアカウントに関連付けられたセッションシステムを使用しているユーザーが表示され、特定の経過時間までにそのセッションは停止していると見なされます。

あなたが本当に現在オンラインを探しているなら、あなたの最初のオプションが最良です。

于 2008-10-06T13:24:11.400 に答える
0

セッションデータがある場合は、それを使用してください。ほとんどのセッションシステムにはすでにタイムスタンプがあるため、x分間使用されていないセッションを期限切れにすることができます。

于 2008-10-06T13:24:52.197 に答える
0

ユーザーセッションが作成されるたびにグローバル変数をインクリメントし、破棄されるとデクリメントすることができます。このようにして、常にオンラインになっているユーザーの数を知ることができます。

一方、時間をかけて監視したい場合は、セッションの開始と終了をデータベースに記録するのが最善のオプションだと思います。単純なクエリを使用して、事後にユーザーアクティビティを計算します。

于 2008-10-06T13:30:10.280 に答える
0

[DISCLAIMER 1---Javaソリューション]

意味のある各ユーザーにセッションが与えられている場合は、独自のSessionListener実装を記述して、作成および破棄された各セッションを追跡できます。

[DISCLAIMER2---コードはテストまたはコンパイルされていません]

public class ActiveSessionsListener implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent e) {
        ServletContext ctx = e.getSession().getServletContext();
        synchronized (ctx) {
            Integer count = ctx.getAttribute("SESSION_COUNT");
            if (count == null) { count = new Integer(0); }
            ctx.setAttribute("SESSION_COUNT", new Integer(count.intValue() + 1);
        }
    }
    public void sessionDestroyed(HttpSessionEvent e) {
        ... similar for decrement ...    
    }
}

そして、これをweb.xmlに登録します。

<listener-class>com.acme.ActiveSessionsListener</listener-class>

お役に立てれば。

于 2008-10-06T13:35:10.973 に答える
0

Webアプリケーションソリューションの唯一の問題は、誰かがいつサインアウトするかわからないことが多いことです。もちろん、ログイン/認証の要件がある場合は、ユーザーがサインオンしたときにキャプチャでき、データアクセスコードの一部として、ユーザーがデータベースにアクセスしたときにログに記録できます。しかし、人がログオフしたときに確実にキャプチャする方法があることを受け入れる必要があります。多くの人は、「ログオフ」アクションを実行せずにサイトから離れるだけです。

于 2008-10-06T13:45:30.797 に答える
0

トリガーを使用することは、Web と非 Web 環境 (またはその他の環境) の間のロジックの違いをいじる必要がなくなる合理的なオプションになると思います。ただし、これは環境への変更をキャプチャするだけで、select ステートメントが作成されても何もしません。ただし、アプリからのすべてのコマンドがストアド プロシージャを介して実行される場合、これは克服できます。

于 2008-10-06T13:48:26.033 に答える
0

Web アプリでは、「オンライン」という概念が少し漠然としています。あなたが実際にできる最善のことは、「過去X分間にリクエストを作成した」または「過去X分間に認証された」ことです。

一連のイベント (要求の実行、更新の実行、認証など) を選択し、それらを DB テーブルに記録します。

それらを別のDBのテーブルに記録します

于 2008-10-07T14:30:46.930 に答える