문제

우리 고객은 알고 싶어합니다 누구 온라인 상태이며 현재 우리가 쓴 사용자 정의 응용 프로그램을 사용하고 있습니다. 나는 그들과 그것을 논의했는데 이것은 정확한, 더 많은 게스트 미팅이 효과가있을 것입니다.

따라서 제 생각은 사용자 활동을 결정하기위한 15 분 간격입니다. 이 작업을 수행하기위한 몇 가지 아이디어는 다음과 같습니다.

  1. 데이터베이스에 부딪 치거나 웹 페이지를 요청할 때마다 마지막 활동의 날짜와 시간으로 사용자 레코드를 스탬프하십시오. 데이터베이스 집약적 일 수 있습니다.

  2. 소프트웨어에서 "온라인 요청"을 보내고 응답을 찾고, 이는 예정된 간격으로 수행 할 수 있으며, 내가받은 각 응답의 현재 날짜 및 시간으로 사용자 레코드를 스탬핑 할 수 있습니다.

당신의 생각은 무엇입니까? 이 상황을 어떻게 처리 하시겠습니까?

설명

가능하면 Windows 또는 웹 모두에 동일한 아키텍처를 사용하고 싶습니다. 여러 사용자 인터페이스와 상호 작용하는 단일 비즈니스 로직 계층이 있으며 Windows 또는 웹 일 수 있습니다.

Windows에 의해 나는 클라이언트 서버를 의미합니다.

설명

N-Tier Architecture를 사용하여 비즈니스 객체가 프레젠테이션 계층과의 모든 상호 작용을 처리합니다. 이 프레젠테이션 계층은 클라이언트-서버 Windows 응용 프로그램, 웹 응용 프로그램, 웹 서비스 등을 공급할 수 있습니다.

우리의 고객, 아마도 100 명의 사용자를 위해 개발되었으므로 트래픽이 높은 응용 프로그램이 아닙니다.

도움이 되었습니까?

해결책

우리의 해결책은 "세션"테이블 (여기에있는 사람을 따르는) 외에 "거래"테이블을 유지하는 것입니다. 업데이트, 삽입 및 삭제 명령어는 모두 "트랜잭션"객체를 통해 관리되며 이러한 각 SQL 명령은 데이터베이스에서 성공적으로 실행되면 "트랜잭션"테이블에 저장됩니다 (업데이트 된 테이블에 따라 : 구체적으로 가능성이 있습니다. 일부 테이블을 따르고 다른 테이블을 무시하십시오). 이 "트랜잭션"테이블에는 TransactionTtype (INSERT, DELETE 용 D, UPDATE의 U), TransactionDateTime 등 및 외국 키 "SessionID"와 같은 다른 필드가 있으며, 누가 지침을 보냈는지 알려줍니다. 일부 코드를 통해 누가 무엇을했는지 확인하는 것이 가능합니다 (Gus가 월요일에 기록을 만들었습니다. Tim은 화요일에 단가를 변경했으며 Liz는 목요일에 추가 할인을 추가했습니다).

이 솔루션의 장점은 다음과 같습니다.

  1. "누구와시기"를 말하고 사용자에게 보여줄 수 있습니다! (SQL 문을 분석하려면 코드가 필요합니다)
  2. 데이터가 복제되고 복제가 실패하면이 테이블을 통해 데이터베이스를 재건 할 수 있습니다.

단점이 있습니다

  1. 한 달에 100,000 개의 데이터 업데이트는 TBL_TRANSACTION에서 100,000 레코드를 의미합니다.
  2. 마지막 으로이 테이블은 데이터베이스 볼륨의 99% 인 경향이 있습니다.

우리의 선택 : 90 일 이상의 모든 기록은 매일 아침 자동으로 삭제됩니다.

다른 팁

전에 전략 1 작업을 보았습니다. 물론 사이트는 작은 사이트였습니다.

StackoverFlow와 같은 사이트가 어떻게 작동하는지 궁금합니다.

내가 사이트 주위를 툴링하고 내 프로필을 살펴보고 여전히 8 분 전에 마지막으로 본 것입니다.

DB에서 로그 레코드 테이블을 떨어 뜨 렸습니다.

userid int fk
액션 숯 (3) ( 'in'또는 'out')
시간 dateTime

누군가가 로그인 또는 아웃하거나 사용자의 마지막 레코드를 업데이트 할 때 테이블에 새 레코드를 삭제할 수 있습니다.

세션 데이터가 있으면 사용하십시오. 대부분의 세션 시스템에는 이미 타임 스탬프가있어 x 분 동안 사용되지 않은 세션을 만료 할 수 있습니다.

사용자 세션이 생성 될 때마다 글로벌 변수를 증가시킬 수 있으며 파괴 될 때 줄일 수 있습니다. 이런 식으로 당신은 할 것입니다 언제나 주어진 순간에 얼마나 많은 사용자가 온라인 상태인지 알고 있습니다.

반면에 시간이 지남에 따라 모니터링하려면 로깅 세션을 시작하고 데이터베이스로 끝나는 것이 가장 좋은 옵션이라고 생각하며 간단한 쿼리로 사실 이후 사용자 활동을 계산합니다.

면책 조항 1 --- Java 솔루션

각 의미있는 사용자에게 세션이 주어지면 생성되고 파괴 된 각 세션을 추적하기 위해 자신의 세션리스트 리너 구현을 작성할 수 있습니다.

면책 조항 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 환경 (또는 해당 문제에 대한 다른 환경) 사이의 논리 차이를 엉망으로 만들지 않아도되는 합리적인 옵션이라고 생각합니다. 그러나 이것은 환경에 대한 변경 사항 만 포착하며 선택한 진술이 이루어질 때 아무것도하지 않습니다. 그러나 이렇게하면 앱의 모든 명령이 저장된 절차를 통해 실행되면 극복 할 수 있습니다.

웹 앱을 사용하면 "온라인"의 개념은 약간 성가신 일입니다. 당신이 실제로 할 수있는 최선은 "마지막 x 분 안에 요청을했거나"또는 "마지막 x 분 안에 인증 된"것입니다.

일련의 이벤트 (요청, 요청, 업데이트, 인증, ...)를 선택하고 DB 테이블에 로그인하십시오.

별도의 DB로 테이블에 로그인하십시오

나는 당신이 나열한 첫 번째 방법을 활용 한 많은 시스템과 협력했으며, 실제로 효과가없는 방식으로 약간의 신중한 계획을 수행 할 수 있습니다.

그것은 당신이 추적하려는시기/방법/방법에 정확하게 달려 있습니다. 여러 세션을 추적 해야하는 경우 일반적으로 사용자 계정에 묶인 세션 시스템을 사용하는 사람들을 보게 된 다음 세션이 정해진 특정 경과 시간으로 인해 사망했습니다.

현재 온라인으로 진정으로 찾고 있다면 첫 번째 옵션이 최고입니다.

방금 내 웹 사이트에 마지막으로 본 시스템을 구현했습니다. 첫 번째 옵션은 비슷하지만 +-5 분마다 업데이트합니다. 그것은 내 상황에서 효과가 있지만 대규모 웹 사이트에는 약간의 추가 요구가 필요할 수 있습니다.

<?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($_SESSION['lastSeen']) ){ /*User logs into the website or lands on the current page, create a lastSeen variable*/
  $_SESSION['lastSeen'] = time();
  updateLastSeen($user_ref, $session_id, $db);
} else {
  $last_seen_time_difference = (time() - $_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);   
    $_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