2012-02-13 3 views
0

나는 Hibernate의 디폴트 traversable resolver를 사용하여 엔티티의리스트를 검증 할 때 데이터베이스에 많은 호출을 할 수있는 메소드를 가지고있다. @Transactional에 주석을 달면 거의 4 배 더 빠르게 실행됩니다. 몇 가지 질문 :왜 Spring의 @Transactional Help 성능이 좋은가

1) 왜 더 빠릅니까?

2) 메소드를 트랜잭션 화하지 않고도이 속도 증가를 어떻게 복제 할 수 있습니까? 트랜잭션에서이 메서드를 래핑 할 필요가 전혀 없으며 트랜잭션 화하는 것이 메서드의 실제 의도와 다릅니다.

+1

어쩌면 트랜잭션 변경 DB 쓰기 횟수를 줄일 수 있습니까? 찾으려는 기본 SQL 명령에 대한 디버그 로깅을 설정할 수 있습니다. – Kevin

+0

이것은 읽기 전용 상태입니다. 내가 Hibernate의 Traversable Resolver가 인스턴스화되는 횟수를 줄이는 것처럼 보이지는 않지만 각각의 인스턴스 사이의 시간을 줄인다 고 말할 수있다. – Derek

+3

나는 이것이 최대 절전 모드 세션과 관련이 있다고 믿는다. 매우 비싼 물체이기 때문에 모든 호출에 대해서 만들어진 모드가 하나만 있는지 확인해야한다. '@ Transactional'은 항상 그렇습니다. OpenSessionInView 필터를 사용하면 다른 방법으로 수동으로 할 수 있습니다. 또한'@ Transactional'을 피할 이유가 없습니다. – mrembisz

답변

1

나는 당신의 데이터베이스 로직이 트랜잭션을 필요로한다고 생각한다. 진행중인 트랜잭션이있는 경우 (예 : Spring이 주석을 기반으로 트랜잭션을 작성하는 경우) 이러한 작업이 트랜잭션에 참여합니다. 진행중인 트랜잭션이 없다면, 그들은 연결을 얻고, 트랜잭션을 시작하고, 각 호출에서 Hibernate 세션을 설정하는 과정을 거쳐야 할 것이다.

방법의 의도와 어떻게 다른가요?

+0

논리는 트랜잭션 적이 지 않습니다 - 나는 어떤 것도 필요하지 않습니다. 원 자성 (atomicity)의 종류 - 데이터베이스에 이미 있는지 여부를 확인하기 위해 많은 엔티티를 반복합니다. 이 메소드의 목적은 전달 된 모든 엔티티가 아직 DB에 없는지 확인하는 것입니다. 메서드가 @Transactional 인 경우 RollbackOnly로 표시되고 원하는대로 진행할 수 없습니다. – Derek

+0

동일한 트랜잭션에서 확인하고 삽입하고 싶지 않은 이유는 무엇입니까? 원하는 트랜잭션 격리에 대한 교과서 사례입니다. – Olaf

관련 문제