복붙노트

[SPRING] Spring TransactionTemplate과 SimpleJdbcTemplate은 스레드로부터 안전한가요?

SPRING

Spring TransactionTemplate과 SimpleJdbcTemplate은 스레드로부터 안전한가요?

현재 많은 스레드에서 사용되는 싱글 톤이 있고 트랜잭션 템플리트와 데이터베이스에 액세스하는 싱글 톤의 기능에 사용되는 SimpleJdbcTemplate에 대한 두 개의 필드를 제외하고는 상태가없는 코드를 다루고 있습니다.

이 템플릿이 안전합니까? 필요할 때마다 새 템플릿을 만들어야합니까?

해결법

  1. ==============================

    1.SimpleJdbcTemplate은 JdbcTemplate을 래핑하기 때문에 TransactionTemplate과 마찬가지로 스레드로부터 안전합니다.

    SimpleJdbcTemplate은 JdbcTemplate을 래핑하기 때문에 TransactionTemplate과 마찬가지로 스레드로부터 안전합니다.

  2. ==============================

    2.실제로는 안된다. 증거는 소스 코드를 참조하십시오. 최소한 TransactionTemplate은 이미 생성 된 쓰레드에는 보이지 않을 수도있는 최종 멤버가 아닌 transactionManager를 가지고 있습니다. 또한 DefaultTransactionDefinition에서 final 및 publicaly 변경 가능하지 않은 모든 멤버를 파생시킵니다.

    실제로는 안된다. 증거는 소스 코드를 참조하십시오. 최소한 TransactionTemplate은 이미 생성 된 쓰레드에는 보이지 않을 수도있는 최종 멤버가 아닌 transactionManager를 가지고 있습니다. 또한 DefaultTransactionDefinition에서 final 및 publicaly 변경 가능하지 않은 모든 멤버를 파생시킵니다.

    실제로 동적 컨테이너 (예 : OSGI)에서는 NPE를 TransactionTemplate 내의 트랜잭션 관리자 사용에 사용할 수 있습니다. 특히 Spring 컨텍스트가 아닌 TransactionTemplate 자체를 생성하는 경우. 작업 스레드 (예 : 웹 요청 프로세서)가 이미 생성되어 있고 (자체 스레드가있는 CPU 캐시가있는) 따뜻하기 때문입니다. 새로운 TransactionTemplate이 init 쓰레드에서 생성 될 때, 쓰레드 바운드 (또는 CPU 코어 바운드) 캐쉬를 없애기 위해 실행되는 메모리 장벽이 없다. 매우 드물게 새로 생성 된 TransactionTemplate의 멤버는 '오래된'스레드에 표시되지 않을 수 있습니다.

    우리는 실행중인 웹 서비스의 최신 업데이트 이후에 analogios (정확하게 TransactionTemplate가 아니라 RetryTemplate) 오류로 인해 생산에 착수했습니다. 컨텍스트 초기화에서 수행 된 글로벌 동기화 때문에 Spring 컨텍스트 생성 인스턴스의 경우 이러한 오류가 표시되지 않는다고 말할 필요가 있습니다.

    거의 모든 Spring 템플릿 클래스는 변경할 수 있으며 내부에 명시적인 동기화가 없습니다. 왜 문서가 스레드 저장인지 이해하지 못한다고 말하는 이유는 무엇입니까?

    JMM의 문장 때문에 * Template에 대한 참조를 포함하는 필드를 final 클래스로 작성하여 부분적으로 보호 할 수 있습니다 (첨부 된 링크 참조). "또한 최종 필드에서 참조하는 다른 객체 나 배열에 대한 가시 값은 적어도 최종 분야만큼이나 최신의 것이어야합니다. "

    이 경우 * Template 인스턴스의 상태를 변경하지 않으면 "스레드 안전"입니다. 클래스 디자인 그 자체가 아니라 특정 사용법과 JMM 속성에 의해 결정됩니다.

    final에 관한 질문과 자바 메모리 모델을 보라.

  3. from https://stackoverflow.com/questions/6747478/is-the-spring-transactiontemplate-and-simplejdbctemplate-thread-safe by cc-by-sa and MIT license