2016-10-19 2 views
0

Spring 프로젝트에서 다음과 같은 구성을 갖고 있으며 응용 프로그램의 다른 부분이 ServiceA의 다른 인스턴스를 가져 오는 경우 ServiceA의 모든 인스턴스가 다음과 같은 단일 인스턴스를 공유하므로 병행 성 문제가 계속 발생합니까? dataSource? BasicDataSource가 threadsafe인지 여부를 간단하게 알아야합니까? 만약 그렇다면, 나는 괜찮습니까? 그렇지 않다면 문제를 일으킬 것입니까?Dropwizard App의 스프링 범위

<bean id="serviceA" name="serviceA" class="com.company.ServiceA" scope="prototype"> 
    <constructor-arg name="dataSource" ref="dataSource"/> 
</bean> 

<bean id="dataSource" destroy-method="close" name="dataSource" 
     class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="${dbConnectionUrl}"/> 
    <property name="username" value="${user}"/> 
    <property name="password" value="${password}"/> 
    <property name="initialSize" value="${connectionSize}" /> 
    <property name="maxActive" value="${maxConnectionSize}" /> 
    <property name="validationQuery" value="SELECT 1" /> 
    <property name="testOnBorrow" value="true" /> 
</bean> 

답변

0

아주 이상한 데이터 소스를 사용하지 않는 한 아무런 문제가 없습니다. Spring의 모든 bean은 세션 bean을 제외하고는 stateless이어야합니다. 봄의 상자 콩은 이것처럼 될 것입니다. 코드에서이 작업을 수행하면 문제가 발생하지 않습니다. 모든 싱글 톤 빈은 본질적으로 정적 일 수 있지만 테스트를 어렵게 만들거나하지 않을 수 있습니다. 세션 bean이 아닌 bean에서 상태를 갖는 동시성 외의 다른 문제점은 응용 프로그램을 확장하고 동일한 웹 응용 프로그램의 여러 인스턴스를 전개하려고 할 때입니다. 이는 대부분 넘어 질 것입니다. 일반적으로 콩은 데이터 소스를 사용하지 않습니다 (이유가있을지라도). 일반적으로 세션 팩토리를 사용하여 작업하고 데이터 소스에 대한 참조가있는 세션 팩토리에서 현재 세션을 가져옵니다. 또는 유사한 엔티티 관리자를 사용하십시오.

편집 의견을 처리합니다. 상태없는 빈 (변수 없음)은 본질적으로 쓰레드에 안전합니다. 따라서 bean이 변수를 가지고 있지 않다면, 원하는만큼 많은 쓰레드를 동시에 접근 할 수 있습니다. Bean이 데이터베이스에 액세스하는 경우에도 데이터베이스가 모든 동시성 데이터 문제를 처리하기 때문에 여전히 스레드로부터 안전합니다. 컨텍스트 전환으로 무엇을 의미하는지 확신 할 수 없습니까? 두 개의 요청은 같은 bean을 통해 실행될 수 있지만 세션 팩토리와는 다른 세션을 가지므로 공유 상태가 없으므로 동시성 문제가 발생하지 않습니다.

세션 팩토리를 읽으면됩니다. 일반적으로 클래스를 데이터베이스에 매핑하기 위해 최대 절전 모드와 같은 것을 사용하고 세션은 데이터베이스에 대한 링크와 같습니다. 이것은 당신을 위해 데이터베이스 작업을위한 모든 종류의 측면을 처리합니다. Spring 애플 리케이션의 대다수는 이와 같다. Spring MVC를 최대 절전 모드로 설정하면 내 뜻을 알 수 있습니다.

REST 서비스가 여전히 세션을 가질 수 있는지에 대한 큰 논쟁이 있지만 실제로 URL에 세션 ID를 전달할 수는 있지만 어떤 식 으로든 말할 수는 있습니다. 매우 이상한 라이브러리를 참조하지 않는 한 병행 상태가 없다면 아무런 문제도 존재할 수 없기 때문에 어떤 세션이나 변수를 가지지 않을 것입니다.

+0

"모든 콩은 무국적이어야합니다". 이게 어떻게 나를 보호 해 주나요? 기본 범위는 싱글 톤입니다. 따라서 Spring이 두 개의 요청을 처리 할 때 잠재적으로 두 개의 요청이 같은 bean을 통해 실행되지는 않을까요? 요청 처리 도중 컨텍스트 전환이 가능하지 않습니까? – MedicineMan

+0

"일반적으로 빈은 데이터 소스를 사용하지 않습니다 (이유가있을지라도). 일반적으로 세션 팩토리로 작업하고 세션 팩토리에서 데이터 소스에 대한 참조를 가진 현재 세션을 가져옵니다." 네가 여기서 말한 것을 이해하지 못한다. 조금 더 자세히 설명해 주시겠습니까? – MedicineMan

+0

사실, 여기서는 REST 서비스를하고 있으므로 말할 세션이 없습니다. – MedicineMan