찾다

 >  Q&A  >  본문

tomcat - 자바 데이터 저장 문제

제목 그대로 로그인 시스템이 있지만 이전 프로젝트에는 캐시가 없지만(추가 권한이 없습니다), 다른 서비스에서는 이전 http 요청의 데이터를 사용해야 합니다(사용자가 구별함) , 매번 http를 반복적으로 요청하는 것을 피하기 위해 저장하고 싶습니다.

백엔드 springmvc

현재 3가지 방법을 생각할 수 있습니다:

1. 세션(HttpSessionListener) 내부에 던지는 것이 가장 쉬울 것이지만 잠재적인 문제를 모르겠습니다
2. 스레드 로컬 내부에 던지십시오(컨트롤러가 정적 스레드 로컬 변수를 만들거나 컨텍스트 홀더를 작성합니다)
3 컨트롤러는 ConcurrentHashMap의 구성원을 만들고 <사용자 ID, http 요청으로 얻은 데이터>에 따라 데이터를 넣습니다. 그러나 이는 확실히 불가능하며 힙 영역 OOF

가 발생할 수 있습니다.

두 번째 옵션에서 발생할 수 있는 문제에 대해 이야기해 보겠습니다.
1. 인터넷에 언급된 메모리 누수 문제가 있는데, 이로 인해 PermGen에서 OOF가 발생합니다. 원문은 ThreadLocal 메모리 누수 사례 분석에 연결되어 있습니다.

ThreadLocalMap의 세트에는 보호 메커니즘이 있기 때문에 문제가 있을지 잘 모르겠습니다(원문이 약간 불분명합니다)

2. 요청 스레드에 데이터 문자열이 표시됩니까? 예를 들어 요청 스레드는 두 사용자(A와 B)의 요청을 동시에 처리합니다. 요청 스레드 A를 제공할 때 B의 데이터를 받았습니다. .

迷茫迷茫2755일 전710

모든 응답(1)나는 대답할 것이다

  • 给我你的怀抱

    给我你的怀抱2017-06-12 09:23:38

    방법 1이 가장 간단하고 가장 일반적으로 사용됩니다. 사용자 수가 너무 많거나 로드 밸런싱이 수행되는 경우 Session의 중앙 집중식 저장소를 구현해야 합니다. HttpSession의 중앙 집중식 저장소를 지원할 수 있는 기성 솔루션이 많이 있습니다. Redis, MongoDB, MySQL 등이 모두 있습니다. GitHub에서 검색해 보세요.

    방법 2는 문제를 해결하지 못합니다. 주로 사용자가 로그인한 후 여러 요청이 여러 스레드에 포함될 수 있기 때문입니다. 두 번째로 언급하신 점도 이유가 됩니다.

    방법 3도 구현 방법입니다. 실제로 Tomcat의 HttpSession은 ConcurrentHashMap을 사용하여 구현되지만(단지 userId 대신 sessionId를 키로 사용함) 주의할 점은 Map의 각 Key-Value를 직접 관리해야 한다는 것입니다. 예를 들어, 수명 주기에서 세션 시간이 초과되면 적시에 제거해야 합니다.

    회신하다
    0
  • 취소회신하다