웹 응용 프로그램의 데이터 컨텍스트로 ThreadLocal을 사용하는 것이 좋은 생각입니까?ThreadLocal을 데이터의 컨텍스트로 사용하는 것이 좋은 생각입니까?
답변
그것이 바로 그 이유입니다. 그러나 문맥이 끝날 때 ThreadLocal을 제거하도록주의하십시오. 그렇지 않으면 메모리 누수가 발생하거나 사용하지 않은 데이터를 너무 오래 보관해야합니다.
ThreadLocals도 매우 빠릅니다. HashMap<Thread,Object>
으로 항상 생각할 수 있습니다. Thread.getCurrentThread()
으로 항상 쿼리됩니다.
그러면'HashMap
이는 데이터의 범위에 따라 다릅니다. ThreadLocal은 사용자 세션과 관련이없는 요청 스레드에만 해당됩니다 (각 요청마다 다른 요청 처리 스레드가 사용될 수 있음). 따라서 요청 처리가 완료 될 때 데이터를 제거하는 것이 중요합니다 (동일한 스레드가 요청을 처리 할 때 다른 사용자의 세션으로 유출되지 않도록).
단일 스레드로 요청/응답 쌍을 작성하는 중이라면 내 경험상 정상적으로 작동합니다. 그러나 아약스 (Ajax) 및 고성능 컨테이너의 등장으로 "이벤트 중심"웹 애플리케이션이 보급되고 있습니다. 이러한 이벤트 중심 모델은 요청 스레드가 자신의 스레드 풀로 반환되도록 허용합니다. I/O 이벤트 중에 스레드가 외부 서비스 호출이 반환되기를 기다리는 동안 점유되지 않도록합니다. 결과적으로 단일 논리 요청은 여러 개의 다른 스레드에 의해 서비스 될 수 있습니다. 서버 기반 NIO와 결합 된 이벤트 기반 아키텍처는 처리량을 크게 향상시킬 수 있습니다.
귀하의 애플리케이션에이 아키텍처가 없다면 나에게 맞는 것처럼 보일 것입니다.
이 모델에 익숙하지 않다면 Tomcat 6의 "혜성"과 Jetty 6의 Continuations를 살펴보십시오. 이것들은 비동기 I/O가 공식적으로 서블릿 3.0을 지원하는 벤더에 특정한 구현물이다. Tomcat 7은 이제 완전히 3.0을 준수한다고 주장합니다.
실제로 "이벤트 구동"일 필요는 없습니다. 유휴 상태 (IO 대기 중) 인 경우 WebSphere 7+가 스레드를 재사용하므로 하나의 스레드가 두 개의 다른 요청을 처리하게 할 수 있습니다. 이 작업을 두 개의 요청간에 '다중화'된 상태로 보았습니다. threadlocals를 사용하면 정말 추악한 버그가 발생합니다. – Renan
ThreadLocal
은 다중 스레드 프로그램에서 스레드가 아닌 프로그램의 정적/전역 프로그램과 거의 같습니다. 즉, ThreadLocal
의 사용은 가증 행위입니다.
아니요, 매개 변수를 사용하지 않고도 컨텍스트 정보를 함수 호출 계층 구조 깊숙히 전달할 수있는 좋은 방법입니다. – Daniel
@ 대니얼 그래, 정확히는 단일 스레드 프로그램에서 정적/전역처럼. –
자신의 세션 처리를 실행하는 경우'ThreadLocal'이 좋은 선택입니다. 대부분의 웹 프레임 워크가이를 대신 할 것이며 더 많은 유연성을 제공 할 것입니다 (예 : NIO 기반 작업자 스레드로 전환, 세션이 스레드간에 전환되는 경우) –
일반적으로 나는 아니오라고 대답합니다. 이를 위해 프레임 워크를 사용하십시오.
웹 응용 프로그램의 웹 계층에서 요청 범위에 대한 데이터 및 상태를 저장하기 위해 세션 컨텍스트 (또는 다른 프레임 워크의 특정 컨텍스트)를 사용합니다.
비즈니스 계층을 도입하면 특정 웹 컨텍스트에 의존해서는 안됩니다. spring
및 Java EE
은 보안, 트랜잭션 및 지속성에 대한 솔루션을 컨텍스트로 제공합니다.
수동으로 터치하면주의해야합니다. 그것은 정리 문제, 메모리 누수 및 이상한 버그로 이어질 수 있습니다 ...
- 1. 그런 상황에서 파티션을 사용하는 것이 좋은 생각입니까?
- 2. 하와이를 데이터베이스 시간대로 사용하는 것이 좋은 생각입니까?
- 3. .Net을 상용 소프트웨어로 사용하는 것이 좋은 생각입니까?
- 4. ViewModels을 집계하는 것이 좋은 생각입니까?
- 5. 지속적인 통합을 위해 HP Quality Center를 사용하는 것이 좋은 생각입니까?
- 6. 통신에서 데이터 서식을 지정하기 위해 XML을 사용하는 것이 좋은 생각입니까?
- 7. 명명 된 뮤텍스의 존재를 지표로 사용하는 것이 좋은 생각입니까?
- 8. 레코드 대신 연결 목록을 사용하는 것이 좋은 생각입니까?
- 9. 아이폰 앱에서 스플래시 화면으로 비디오를 사용하는 것이 좋은 생각입니까?
- 10. 유니 코드 기호를 Java 식별자로 사용하는 것이 좋은 생각입니까?
- 11. Django :이 상황에서 추상 기본 모델을 사용하는 것이 좋은 생각입니까?
- 12. 자바 스크립트 선택기에 html5 데이터 속성을 사용하는 것이 좋은 생각입니까?
- 13. 상위 패키지의 클래스에서 하위 패키지의 API를 사용하는 것이 좋은 생각입니까?
- 14. UAV 로봇에서 단일 보드 컴퓨터를 사용하는 것이 좋은 생각입니까?
- 15. Workers를 사용하여 이벤트를 확인하는 것이 좋은 생각입니까?
- 16. 코인 플립을 시뮬레이션하는 것이 더 좋은 생각입니까?
- 17. 기계어 프리미티브의 복수가 아닌 것이 좋은 생각입니까?
- 18. mysql 연결을 정적으로 만드는 것이 좋은 생각입니까?
- 19. Python 클래스 구문 -이 것이 좋은 생각입니까?
- 20. 자체 생성자에서 스레드를 시작하는 것이 좋은 생각입니까?
- 21. VCS에 문서를 보관하는 것이 좋은 생각입니까?
- 22. MySQL에 그래프를 저장하는 것이 좋은 생각입니까?
- 23. VB.net, ASP.net에서 Java로 전환하는 것이 좋은 생각입니까?
- 24. Google 스프레드 시트에 $ .post하는 것이 좋은 생각입니까?
- 25. Mulitple FileSystemWatchers는 좋은 생각입니까?
- 26. 데이터베이스를 사용하는 것이 좋은 생각은 언제입니까
- 27. PHP/Apache에서 프로세스 포크를 만드는 것이 좋은 생각입니까?
- 28. 각 도메인 객체에 대한 인터페이스를 만드는 것이 좋은 생각입니까?
- 29. BaseController에 콘텐츠 액세스 논리를 추가하는 것이 좋은 생각입니까?
- 30. DOM 만 사용하여 PHP 웹 사이트를 만드는 것이 좋은 생각입니까?
왜 프레임 워크에서 제공하는 SessionContext를 사용하지 않습니까? –
@Marcos, SessionContext가 Java에 의해 제공된다고 말하는가? 죄송합니다 당신이 참조하는 프레임 워크를 얻지 못했습니다 ... – peakit
나는 그가 HttpSession 및/또는 ServletContext (응용 프로그램 범위)를 언급하고 있었다고 생각합니다. – jhouse