2011-02-01 5 views
3

웹 응용 프로그램의 데이터 컨텍스트로 ThreadLocal을 사용하는 것이 좋은 생각입니까?ThreadLocal을 데이터의 컨텍스트로 사용하는 것이 좋은 생각입니까?

+0

왜 프레임 워크에서 제공하는 SessionContext를 사용하지 않습니까? –

+0

@Marcos, SessionContext가 Java에 의해 제공된다고 말하는가? 죄송합니다 당신이 참조하는 프레임 워크를 얻지 못했습니다 ... – peakit

+0

나는 그가 HttpSession 및/또는 ServletContext (응용 프로그램 범위)를 언급하고 있었다고 생각합니다. – jhouse

답변

6

그것이 바로 그 이유입니다. 그러나 문맥이 끝날 때 ThreadLocal을 제거하도록주의하십시오. 그렇지 않으면 메모리 누수가 발생하거나 사용하지 않은 데이터를 너무 오래 보관해야합니다.

ThreadLocals도 매우 빠릅니다. HashMap<Thread,Object>으로 항상 생각할 수 있습니다. Thread.getCurrentThread()으로 항상 쿼리됩니다.

+2

그러면'HashMap >'가 될 것이지만 AFAIK는'Thread' 객체의 내부 Map '일뿐입니다. –

6

이는 데이터의 범위에 따라 다릅니다. ThreadLocal은 사용자 세션과 관련이없는 요청 스레드에만 해당됩니다 (각 요청마다 다른 요청 처리 스레드가 사용될 수 있음). 따라서 요청 처리가 완료 될 때 데이터를 제거하는 것이 중요합니다 (동일한 스레드가 요청을 처리 할 때 다른 사용자의 세션으로 유출되지 않도록).

2

단일 스레드로 요청/응답 쌍을 작성하는 중이라면 내 경험상 정상적으로 작동합니다. 그러나 아약스 (Ajax) 및 고성능 컨테이너의 등장으로 "이벤트 중심"웹 애플리케이션이 보급되고 있습니다. 이러한 이벤트 중심 모델은 요청 스레드가 자신의 스레드 풀로 반환되도록 허용합니다. I/O 이벤트 중에 스레드가 외부 서비스 호출이 반환되기를 기다리는 동안 점유되지 않도록합니다. 결과적으로 단일 논리 요청은 여러 개의 다른 스레드에 의해 서비스 될 수 있습니다. 서버 기반 NIO와 결합 된 이벤트 기반 아키텍처는 처리량을 크게 향상시킬 수 있습니다.

귀하의 애플리케이션에이 아키텍처가 없다면 나에게 맞는 것처럼 보일 것입니다.

이 모델에 익숙하지 않다면 Tomcat 6의 "혜성"과 Jetty 6의 Continuations를 살펴보십시오. 이것들은 비동기 I/O가 공식적으로 서블릿 3.0을 지원하는 벤더에 특정한 구현물이다. Tomcat 7은 이제 완전히 3.0을 준수한다고 주장합니다.

+1

실제로 "이벤트 구동"일 필요는 없습니다. 유휴 상태 (IO 대기 중) 인 경우 WebSphere 7+가 스레드를 재사용하므로 하나의 스레드가 두 개의 다른 요청을 처리하게 할 수 있습니다. 이 작업을 두 개의 요청간에 '다중화'된 상태로 보았습니다. threadlocals를 사용하면 정말 추악한 버그가 발생합니다. – Renan

1

ThreadLocal은 다중 스레드 프로그램에서 스레드가 아닌 프로그램의 정적/전역 프로그램과 거의 같습니다. 즉, ThreadLocal의 사용은 가증 행위입니다.

+0

아니요, 매개 변수를 사용하지 않고도 컨텍스트 정보를 함수 호출 계층 구조 깊숙히 전달할 수있는 좋은 방법입니다. – Daniel

+3

@ 대니얼 그래, 정확히는 단일 스레드 프로그램에서 정적/전역처럼. –

+0

자신의 세션 처리를 실행하는 경우'ThreadLocal'이 좋은 선택입니다. 대부분의 웹 프레임 워크가이를 대신 할 것이며 더 많은 유연성을 제공 할 것입니다 (예 : NIO 기반 작업자 스레드로 전환, 세션이 스레드간에 전환되는 경우) –

1

일반적으로 나는 아니오라고 대답합니다. 이를 위해 프레임 워크를 사용하십시오.

웹 응용 프로그램의 웹 계층에서 요청 범위에 대한 데이터 및 상태를 저장하기 위해 세션 컨텍스트 (또는 다른 프레임 워크의 특정 컨텍스트)를 사용합니다.

비즈니스 계층을 도입하면 특정 웹 컨텍스트에 의존해서는 안됩니다. springJava EE은 보안, 트랜잭션 및 지속성에 대한 솔루션을 컨텍스트로 제공합니다.

수동으로 터치하면주의해야합니다. 그것은 정리 문제, 메모리 누수 및 이상한 버그로 이어질 수 있습니다 ...

관련 문제