質問

お客様は、誰がオンラインで、現在作成したカスタムアプリケーションを現在使用しているかを知りたいと考えています。私は彼らとそれを話し合ったが、これは正確である必要はなく、より多くのゲストが動作します。

だから私の考えは、ユーザーアクティビティを決定する15分間隔です。これを行うためのアイデアは次のとおりです。

  1. データベースにアクセスしたり、Webページを要求したりするたびに、最後のアクティビティの日時をユーザーレコードにスタンプします。 / li>

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

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

明確化

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

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

明確化

n層アーキテクチャを使用しているため、ビジネスオブジェクトがプレゼンテーションレイヤーとのすべてのやり取りを処理します。そのプレゼンテーション層は、クライアントサーバーのWindowsアプリケーション、Webアプリケーション、Webサービスなどを提供することができます。

高トラフィックアプリケーションではありません。当社の顧客向けに開発されたものであり、最大で100人のユーザー向けです。

役に立ちましたか?

解決

当社の解決策は、「トランザクション」を維持することです。 「セッション」に加えて、テーブル(実行内容に続く)表(誰がここにいたかを示します)。 UPDATE、INSERT、およびDELETE命令はすべて、「トランザクション」を通じて管理されます。オブジェクトとこれらの各SQL命令は、「トランザクション」に保存されます。データベースで正常に実行されると、テーブルが更新されます(更新されたテーブルによって異なります。一部のテーブルを明確に追跡し、他のテーブルを無視する可能性があります)。この「トランザクション」テーブルには、transactiontType(INSERTの場合はI、DELETEの場合はD、UPDATEの場合はU)、transactionDateTimeなどの他のフィールド、外部キー「sessionId」などがあり、最終的に誰が命令を送信したかを示します。いくつかのコードを使用して、誰が何をいつ実行したかを特定することも可能です(ガスは月曜日にレコードを作成し、ティムは火曜日に単価を変更し、リズは木曜日に追加の割引を追加しました)。

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

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

短所は

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

選択:90日より古いすべてのレコードは毎朝自動的に削除されます

他のヒント

以前に戦略1が機能するのを見てきました。もちろん、このサイトは小さなものでした。

stackoverflowのようなサイトはどのようにそれを行うのだろうか?

特定のイベントをターゲットにする必要があります。サイトを駆け巡り、プロフィールを見て、最後に見た8分前のようなことを言っています。

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

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

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

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

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

長期にわたって監視したい場合は、データベースへのセッションの開始と終了をログに記録するのが最適な選択肢であり、単純なクエリで事後のユーザーアクティビティを計算します。

[免責条項1 --- Javaソリューション]

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

[免責事項2 ---テストまたはコンパイルされていないコード]

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>

これがお役に立てば幸いです。

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

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

ウェブアプリでは、「オンライン」の概念は少し曖昧です。実際にできることは、「最後のX分間にリクエストを送信する」ことです。または「最後のX分間に認証されました」。

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

別のDBのテーブルにログを記録します

最初に挙げた方法を使用した多くのシステムで作業しましたが、実際にはあまり効果がない方法で少し慎重に計画することができます。

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

現在オンラインを本当に探している場合は、最初のオプションが最適です。

ウェブサイトに最後に見たシステムを実装しました。最初のオプションも似ていますが、+-5分ごとに更新するだけです。私の状況では機能しますが、大規模なWebサイトでは少し余分なものが必要になる場合があります。

<?php
function updateLastSeen($user_ref, $session_id, $db) { /*Parameters: The user's primary key, the user's session id, the connection to the database*/
  $timestamp = date('Y-m-d H:i:s');
  if ($session_id !== '') {
    /*logged in*/
    $sql_check = "SELECT user_id FROM user_last_seen WHERE user_id = ?";
    $stmt_check = $db->prepare($sql_check);
    $stmt_check->bind_param('s', $user_ref);
    $result_check = $stmt_check->execute();
    $stmt_result_check = $stmt_check->get_result();
    if ($stmt_result_check->num_rows > 0) { /*If the user's last seen was previously recorded, update his record*/
      $sql = "UPDATE user_last_seen SET last_seen = ? WHERE user_id = ?"; 
    } else { /*Otherwise, insert a record for him*/
      $sql = "INSERT INTO user_last_seen (last_seen, user_id) VALUES (?,?)";
    }
    $stmt = $db->prepare($sql);
    $stmt->bind_param('ss', $timestamp, $user_ref);
    $result = $stmt->execute();
  }
}
if( !isset(

ウェブサイトに最後に見たシステムを実装しました。最初のオプションも似ていますが、+-5分ごとに更新するだけです。私の状況では機能しますが、大規模なWebサイトでは少し余分なものが必要になる場合があります。

<*>SESSION['lastSeen']) ){ /*User logs into the website or lands on the current page, create a lastSeen variable*/

ウェブサイトに最後に見たシステムを実装しました。最初のオプションも似ていますが、+-5分ごとに更新するだけです。私の状況では機能しますが、大規模なWebサイトでは少し余分なものが必要になる場合があります。

<*>SESSION['lastSeen'] = time(); updateLastSeen($user_ref, $session_id, $db); } else { $last_seen_time_difference = (time() -

ウェブサイトに最後に見たシステムを実装しました。最初のオプションも似ていますが、+-5分ごとに更新するだけです。私の状況では機能しますが、大規模なWebサイトでは少し余分なものが必要になる場合があります。

<*>SESSION['lastSeen']) / 60; if ($last_seen_time_difference > 5) { //if the difference between now and the lastSeen is 5 minutes or more, record his last seen. updateLastSeen($user_ref, $session_id, $db);

ウェブサイトに最後に見たシステムを実装しました。最初のオプションも似ていますが、+-5分ごとに更新するだけです。私の状況では機能しますが、大規模なWebサイトでは少し余分なものが必要になる場合があります。

<*>SESSION['lastSeen'] = time(); /*after updating the database, reset the lastSeen time to now.*/ }/* else { //do nothing. Don't update database if lastSeen is less than 5 minutes ago. This prevents unnecessary database hits. }*/ }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top