2014-04-16 3 views
15

Hibernate API에는, true로 설정할 수있는 hibernate.connection.autocommit 속성이있다. (그것은 아닌 권장)Hibernate에서 "hibernate.connection.autocommit = true"가 권장되지 않는 이유는 무엇입니까?

는 JDBC 풀링 된 커넥션들에 대해 자동 커밋을 사용합니다 :

그러나 API에서

, 그들은 그렇게처럼 설정하지 않는 것이 좋습니다 언급했다.

왜 권장하지 않습니까? 이 속성을 true로 설정하면 좋지 않은 영향이 있습니까?

답변

6

내 이해는 Hibernate가 자동 커밋하면 부분적으로 실패한 플러시가 롤백되지 않는다는 것을 이해한다. 불완전한/깨진 개체 그래프가 나타납니다.

당신이 뭔가에 자동 커밋과의 연결을 원하는 경우, 당신은 항상 랩을 해제 할 수있는 새로, 기본 JDBC 연결, 그 위에 setAutocommit(true)을 얻을 JDBC API를 setAutocommit(false)를 통해 작업을 수행하고 세션을 닫습니다 Session를 만들었습니다. 나는 이 아니며은 이미 완료된 Session에서 이것을 권장합니다.

+0

하이버 네이트 후드 JDBC를 사용한다. autoCommit은 "명령문 당 트랜잭션"을 의미하는 JDBCConnection의 개념입니다. 트랜잭션 범위 = 1 sql 문 [autocommit = true] hibernate.connection.autoCommit = true는 각 명령문이 완료되면 완료되게하므로 하나 이상의 작업 단위 (UOW)의 일부로 두 개 이상의 명령문을 커밋/롤백 할 수 없습니다. 우리는 모든 명령문을 실행하거나 실행하지 않으려 고합니다. 트랜잭션의 시작과 끝을 표시해야하고 autoCommit을 비활성화해야합니다. –

+0

hibernate.connection.autocommit = 거짓 이 시나리오 명시 적 트랜잭션 경계 :. 는 SessionFactory.openSession() session.beginTransaction() session.getTransaction() (커밋) // 플러시 세션, TXN 세션을 커밋합니다. close()를 암시 적 트랜잭션 경계 는 SessionFactory.openSession() 때문에 //이 //하지만 암시 TXN를 더 트랜잭션 사용을 참조하십시오 없습니다 - 자동 커밋이 은 Session.flush() 은 session.close() 여기 거짓 - 세션을 닫을 때, 특정 atherion이 명확하지 않다 오라클의 vendor specific behavior - 모든 SQL 문이 커밋 됨 in postgresql - 모든 SQL 문이 롤백 됨 –

10

기본적으로 자동 커밋 값은 false이므로 트랜잭션을 명시 적으로 커밋해야합니다. 이것은 변경 사항이 데이터베이스에 반영되지 않는 이유 일 수 있고, 그렇지 않으면 커밋 전에 변경 사항을 강제 실행하도록 플러시 할 수 있습니다.

세션을 닫으면 데이터베이스에 암시 적으로 커밋됩니다 (구현에 따라 다름).

계단식 트랜잭션 &을 원 자성을 위해 롤백해야 할 경우 트랜잭션 &을 제어해야합니다.이 경우 자동 확정은 false 여야합니다.

autocommit을 true로 설정하거나 트랜잭션을 명시 적으로 처리하십시오.

Here은 좋은 설명입니다.

Hibernate forum과 관련된.

Stackoverflow question입니다.

4

모든 데이터베이스 문은 실제 트랜잭션 even when we don’t explicitly declare transaction boundaries (BEGIN/COMMIT/ROLLBACK) 컨텍스트 내에서 실행됩니다.

트랜잭션 경계를 선언하지 않으면 각 문을 별도의 트랜잭션으로 실행해야합니다. 이것은 명령문마다 하나의 연결을 열고 닫을 수도 있습니다.

@Transactional로 서비스를 선언하면 전체 트랜잭션 기간 동안 하나의 연결이 제공되며 모든 명령문은 단일 격리 연결을 사용합니다. 이것은 우선 명시 적 트랜잭션을 사용하지 않는 것보다 낫습니다. 대규모 응용 프로그램에서는 많은 동시 요청이있을 수 있으며 reducing database connection acquiring request rate은 전반적인 응용 프로그램 성능을 확실히 향상시킵니다.

그래서 엄지 손가락의 규칙은 : 당신이 하나 개의 쿼리를 실행 거래 읽기 전용 한 경우

  1. , 당신이 사람들을 위해 자동 위탁 활성화 할 수 있습니다.

  2. 둘 이상의 명령문을 포함하는 트랜잭션이있는 경우 모든 작업을 단일 작업 단위로 실행하고 추가 작업을 수행하지 않으려 고하므로 자동 커밋을 비활성화해야합니다. 연결 풀.

2

작업 당 세션 패턴 반 패턴을 사용하지 마십시오. 단일 스레드에서 모든 간단한 데이터베이스 호출에 대해 세션을 열고 닫지 마십시오. 데이터베이스 트랜잭션에서도 마찬가지입니다. 응용 프로그램의 데이터베이스 호출은 계획된 순서를 사용하여 작성됩니다. 그들은 원자 단위의 작업 단위로 그룹화됩니다. 이것은 또한이 모드가 ad-hoc SQL 콘솔 작업을위한 것이므로 응용 프로그램에서 모든 단일 SQL 문 다음에 자동 커밋이 쓸모 없다는 것을 의미합니다. Hibernate는 어플리케이션 서버가 자동 커밋 모드를 즉시 불가능하게하거나, 사용 불가능하게 할 것을 기대한다. 데이터베이스 트랜잭션은 선택 사항이 아닙니다. 데이터베이스와의 모든 통신은 트랜잭션 내에서 발생해야합니다. 많은 작은 트랜잭션이 하나의 명확하게 정의 된 작업 단위 (UOW)보다 잘 수행되지 않으므로 데이터 읽기에 대한 자동 커밋 (aut-commit) 동작은 피해야합니다. 후자는 또한 유지 보수 가능하고 확장 가능합니다.

find more information on this topic