Spring JPA

[Hibernate] setAutoCommit 최적화

에드박 2023. 1. 3. 21:09

Hibernate Transaction 작업 수행 시, setAutoCommit 동작 순서

Transaction 시작

-> setAutoCommit(false)
-> 쿼리 1 수행
-> 쿼리 2 수행
-> setAutoCommit(true)
-> Commit 또는 Rollback

 

Hibernate가 매번 setAutoCommit(false) & setAutoCommit(true) 설정을 해야하므로, 불필요한 실행시간이 발생 (2ms ~ 4ms)
또한 setAutoCommit 은 실제 DB에 직접 쿼리(set autocommit = {true or false}) 를 날리게 됨 -> 비효율적

※ setAutoCommit(true) 로 다시 설정하는 이유
트랜잭션을 위해 false 로 설정했던 auto commit을 기존 설정인 true 로 되돌려놓기 위함이다.

 

커넥터의 구현체를 보면 알 수 있음

< MariaDbConnection.java >
        
  /**
    * Sets whether this connection is auto commited.
    *
    * @param autoCommit if it should be auto commited.
    * @throws SQLException if something goes wrong talking to the server.
    */
   public void setAutoCommit(boolean autoCommit) throws SQLException {
       if (autoCommit == getAutoCommit()) return;
       
       try (Statement stmt = createStatement()) {
           stateFlag |= ConnectionState.STATE_AUTOCOMMIT;
           stmt.executeUpdate("set autocommit=" + ((autoCommit) ? "1" : "0"));
       }
   }

 

setAutoCommit() 을 하지 않는 방법

 hibernate.connection.provider_disables_autocommits = true  로 설정하면 DB 커넥션의 autoCommit 설정에 따른다.

이때, DBCP의 autoCommit 설정은 반드시 false로 두어야 한다.(중요)

  • 만약  hibernate.connection.provider_disables_autocommits = false  로 설정하면, DB 커넥션의 설정을 믿지 않는다는 의미로, getAutoCommit() 을 호출해 DBCP의 설정이 적절하지않으면 setAutoCommit을 통해 변경한다.
  • 만약  hibernate.connection.provider_disables_autocommits = true 로 설정하고, DBCP의 autoCommit 설정은 true로 둔다면?
    • DBCP의 설정에 따르는데 auto commit 이 true 로 설정됐으므로, Transaction이 동작하지 않는다.

 

참조

- https://pkgonan.github.io/2019/01/hibrnate-autocommit-tuning

- https://kwonnam.pe.kr/wiki/java/hibernate/performance