2012-08-27 3 views
2

모든 bean이 기본 스코프 (프로토 타입 또는 세션 없음) 인이 새로운 mvc 프로젝트가 있습니다. 단일 응용 프로그램 컨텍스트가있는 스프링 mvc가 모든 bean 싱글 톤을 선언합니다

나는 모든 bean을 기본 범위로 만들기 때문에 을 알고 싶다. 전체 응용 프로그램을 단일 스레드에서 실행하려고 시도하고 있는가?

(여러 세션 또는 동일한 세션의 각 httprequest가 이전 세션이 완료 될 때까지 대기열에 저장되도록하려면 해당 시나리오를 피하는 방법이 도움이 될 수 있습니다.

저는 비교적 봄과 자바 개발에 새로운입니다.

+2

나는 UR HttpRequest를 것 같아요가 없다 대기열에 넣고 이전 작업이 완료 될 때까지 기다립니다. 스프링 문서를 자세히 읽어보십시오. 모든 ur 질문은 이미 응답되었습니다 :-) – Arun

답변

8

스프링 빈은 일반적으로 상태 비 저장이므로 여러 스레드에서 안전하게 호출 할 수 있습니다. 그게 당신의 응용 프로그램이 작동하는 방법입니다 : 모든 컨트롤러, 서비스, DAO 등의 인스턴스는 하나뿐입니다. 그러나 Spring을 통한 서블릿 컨테이너는 이러한 스레드를 여러 스레드에서 호출합니다.

사실 단순한 서블릿의 상황은 동일합니다. 각 서블릿의 인스턴스 만 있고 무한 수의 스레드로 액세스 할 수 있습니다. 이 서블릿이 상태 비 저장되거나 적절하게 동기화되어있는 한.

스프링을 풀링 된 의 상태없는 세션 빈과 혼동하지 말고 각 클라이언트는 풀에서 자체 인스턴스를 가져옵니다. 1

1 - 좀 바보의 사실 - 콩이 정의에 의해 무 상태이기 때문에, 동시 액세스를 풀링 및 예방에 아무 소용 ...

+0

EJB 사양에 대한 의견과 관련하여 : 왜 풀링이 필요합니까? Exception을 던진 후에도 작동하지 않을 Java EE 부분이 있습니다 (예 : [Hibernate/JPA에서 Exception handling] (http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html) /ch13.html#transactions-demarcation-exceptions)). 이 경우, 컨테이너는 1. 빈에서 실패한 구성 요소를 다시 주입하거나 (예 : EJB 인스턴스의'EntityManager'를 재 주입) 2. 단순히 빈을 버리고 다른 인스턴스를 작성해야합니다. 두 번째 해결 방법이 선택되었습니다. 이 사건은 봄에 어떻게 다루어 집니까? –

+0

나는 이것이 일반적인 실수이며 봄 콩과의 큰 차이라고 생각한다. 상태 비 저장 EJB는 클라이언트 관점에서 비 상태 유지 (stateless)를 의미합니다. 이는 클라이언트 요청을 처리하는 bean이 무엇이든 상관 없습니다. 반면에 이러한 bean은 생성하기에 광대 한 자원 또는 다른 내부 상태를 보유 할 수 있습니다. 따라서 풀링은 스레드 안정성뿐 아니라 성능 이점도 제공합니다. – Kousalik

0

싱글 톤은 각 빈의 인스턴스가 하나만 있다는 것을 의미합니다. 일반적으로 이러한 콩은 아무런 상태도없는 처리 요소입니다. 그들에게 불려지는 메소드는 작업 할 입력이 들어있는 컨텍스트를 통과합니다. 따라서 이러한 싱글 톤 빈에 대한 메소드 호출은 본질적으로 스레드로부터 안전합니다.

관련 문제