2014-12-28 2 views
-1

내 응용 프로그램에서 로그인 및 기타 작업을 수행하는 하나의 서블릿이 있습니다. 이 단일 서블릿에서 세션 ID로 키 입력 된 hastable에 사용자를 저장합니다.Java 다중 서블릿 스레드 안전성 해시 테이블

Hashtable<string,MySession> sessions; //sessionid and MySession instance 

는하지만 로그인 과정은 약간 복잡하고 비즈니스 문제를 포함, 그래서 나는 내가이 서블릿 로그인에 대한 하나 작동 하나를 갖고 싶어, 분리해서하기로 결정했다. 로그인 서블릿은 MySession을 생성하고이를 저장하고 클라이언트를 조작 서블릿에 전달합니다. 결과적으로 두 서블릿 모두 로그인조작은이 해시 테이블을 공유해야합니다. 질문이

,

  • 은 내 현재의 구조는 threadsafed입니까? 나는 하나의 서블릿 인스턴스를 의미하는데, 여기서 모든 사용자는 hastable에 저장됩니까? addNewSession 및 clearSession과 같은 메소드를 수정하는 해시 테이블이 있습니다. (나는 브라우저 세션 ID를 키로 사용한다). 이 방법은 (서블릿의 단일 인스턴스) 내가 너무 정적이 hastable를 선언하면 내가 모두 새로운 분리 서블릿 (로그인 및 운영)

  • 에서 도달 할 수있는 일이 무엇인지

  • 제안되지 않기 때문에 나는이 방법은 동기화하지 않았다

  • 부모 서블릿에이 hastable을 저장하고 그 서블릿에서 로그인 및 작업을 확장하면 부모 서블릿이 해시 테이블 인스턴스를 보호 할 수 있습니다.

  • 서블릿 contenxt 메서드를 사용하면 컨텍스트에서 다른 서블릿에 도달하거나 컨텍스트에서 해시 테이블을 직접 저장할 수 있습니까? 스레드 안전 문제가 해결 될까요? 또는 내가해야한다고 생각합니다 ServletContext 개체에 대한 getServletContext()에 의해 반환 된 myapplication에서 서블릿간에 공유되기 때문에 동기화를 제공합니까?

현재의 구조는 다음과 같습니다

public SingleServlet extends HttpServlet { 
    Hashtable<string,MySession> sessions = new Hashtable(); 

    public void doGet(HttpRequest request, HttpResponsr response) { 
     String sessionId = request.getSessionId(); 

     if (sessions.get(sessionId) == null) { 
      // Create a new session and store 
      // Do login operations 
      MySession iNewSession = new MySession(..); 

      // Thread safety?? 
      sessions.put(sessionId, iNewSession); 
     } else { 
      // Already existing session, operate on that 
      MySession iExistingSession = sessions.get(sessionId); 

      // Check if operation is logout 
      if (isLogout(request)) { 
       iExistingSession.performLogout(); 

       // Thread safety?? 
       sessions.remove(sessionId); 
      } else 
      iExistingSession.continueOperation(request, response); 
     } 
+3

왜 네이티브 세션에서 이미 수행하고있는 작업을 재발 명하고 있습니까? –

+0

당신은 아파 시라를 의미합니까? – benchpresser

+0

아니요, HttpSession을 의미합니다. 그게 정확히 뭐지 : 당신이 원하는 모든 속성을 저장할 수있는 각 세션 ID에 대한 해시 테이블. –

답변

0

코드는 스레드 안전하지 않습니다. put, getremove과 같은 개별 작업은 원자 적이며 스레드로부터 안전하지만 일련의 작업 (예 : get 다음에 put)은 스레드로부터 안전하지 않습니다.

+0

java.util.concurrent의 ConcurrentHashMap은 1.5 이후 Hashtable보다 나은 선택이지만이 경우 문제가 해결 될까요? 아니면 다른 제안이 있습니까? –