2011-11-14 3 views
8

webapp을 디버깅하고 있습니다. 시작할 때 DataSourceTransactionManager 빈과 HibernateTransactionManager 빈을 생성하도록 설정된다. 이것은 의도적 인 것이 아니지만 타사 종속성으로 인해 발생합니다. 효과는 양성으로 보입니다. 내가 디버깅을 통해보고있는 것은 Hibernate 기반 DAO를 통해 객체를 영속화 할 때 DataSourceTransactionManager가 호출되고 HibernateTransactionManager는 호출되지 않는다는 것입니다. 빈은 모두 'transactionManager'라고 불립니다. Spring Javadoc은 (지금 생각해 보면, 다시 읽는다고 생각합니다.) 지역 리소스에 대해서는 괜찮습니다. 바로 이것이 우리의 상황입니다. 나는. 분산 된 JTA 기반 환경이 아닙니다.HibernateTransactionManager 대신 ORM 지속성을 위해 DataSourceTransactionManager를 사용해도 괜찮습니까?

제 질문은 ORM 기반 지속성을 위해 HibernateTransactionManager를 사용하지 않는 것이 부정적인 영향을 미치는지입니다. HibernateTransactionManager가 DAO의 @Transactional 어노테이션에있는 한정자를 통해 사용되도록 설정을 변경할 수 있습니다.

간단한 단위 테스트, 통합 테스트 설정에서 문제가 없지만 수천 명의 사용자와 높은 수준의 동시성이있을 때 전체 프로덕션 볼륨으로 확장하는 것이 더 중요합니다.

TIA, 이것이 너무 애매하지 않기를 바랍니다.

봄 3.0.x BTW.

이것은 스프링 3.1 문서에 있습니다.

초 11.9 "일반적인 문제에 대한 해결책".

트랜잭션 기술 및 요구 사항 중 선택하여 올바른 PlatformTransactionManager 구현을 사용하십시오.

답변

6

이렇게하면 문제가 발생할 수 있습니다. 하이버 네이트 txn 관리자가 없으면 HibernateOperations에 대한 모든 호출은 트랜잭션 외부와 별도의 세션에서 가능하며 자동 커밋을 사용한다. 따라서 오류가 발생하면 모든 것이 정상적인 것처럼 보일 수 있습니다. 롤백 할 것으로 예상되는 변경 사항을 찾을 수 없습니다.

  • 은 '뭔가'가 DB에 여부를 표시할지 여부를

확인을 커밋 뭔가를

  • 던져 예외
  • 을 저장 트란 시작 확인하려면 다음을 시도하십시오.

    또 다른 검사가 트란

  • 부하 뭔가
  • 액세스 무언가에서 다른 객체의 관계를 시작

    • 하고이 관련 개체의 속성 (안 PK)에 액세스 할

    동봉하는 txn이 최대 절전 txn 관리자에 의해 관리되지 않기 때문에 세션이로드에서 열린 상태로 유지되지 않으므로 마지막 호출이 예외로 인해 발생할 수 있습니다.

  • +0

    +1 흠. 재미있는. 고맙습니다. 이 테스트 중 하나를 시도합니다. DAO 호출은 트랜잭션 내에서 발생하고 DAO는 getSession()을 호출하므로 Spring SessionFactoryUtils가 새로운 세션을 손에 넣고 모든 것이 잘된 것처럼 보입니다. 그러나 당신이 말한대로 - 우리는 얼마나 자주 롤백을 쉬는 것을 기억합니까? –

    +4

    좋은 사람. 나는이 시험을 시도했다. 저장 후 Hibernate tx mgr과 함께 저장이 롤백 된 후 예외가 발생했습니다. DataSourceTransactionManager에서는 그렇지 않습니다. –

    +0

    당신은 당신의 말을 뒷받침 해주는 공식 문서를 제공 할 수 있겠습니까? "Hibernate txn 관리자없이 HibernateOperations에 대한 모든 호출은 트랜잭션과 별도의 세션에있게 될 것입니다"? 나는 DataSourceTransactionManager + Hibernate를 사용하고있다. – DerekY

    관련 문제