사용자 도구

사이트 도구


java:hibernate:4

Hibernate 4

문제점

Statement 2중 close 문제

최신 버전에서는 4.2.x, 4.3.x 모두 해결된 상태이다.

현재 4.2.15버전에서 Comoposite Key 사용시에 Insert 등의 작업시에 closed statement에 대해 getWarnings를 호출하는 문제가 있어보인다. 예외를 잡아서 debug로그로 남기고 그냥 넘어가기 때문에 실질적인 문제는 안되지만 성능상 안 좋아보인다.

HHH-9174 로그 레벨을 체크하여 필요할 경우에만 로그를 찍게 수정되었다. 그러나 근본적인 문제는 Statement가 이미 close 된 상태에서 아래 메소드를 호출한다는 점이다.

org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch#addToBatch.addToBatch에서 statement를 두번 release 한다. HHH-8952 NonBatchingBatch releases statements twiceHibernate 4.3.2에서 수정됨 그러나 4.2.x 에서는 그대로 남아있는 상태.

org.hibernate.engine.jdbc.spi.SqlExceptionHelper#handleAndClearWarnings(java.sql.Statement, org.hibernate.engine.jdbc.spi.SqlExceptionHelper.WarningHandler)

// See HHH-9174.  Statement#getWarnings can be an expensive call for many JDBC libs.  Don't do it unless
// the log level would actually allow a warning to be logged.
if (LOG.isEnabled(Level.WARN)) {
    try {
        walkWarnings(statement.getWarnings(), handler);
    } catch (SQLException sqlException) {
        // workaround for WebLogic
        LOG.debug("could not log warnings", sqlException);
    }
}

4.2버전에서 단기 해결책은 로그 레벨을 ERROR로 변경하는 것이다.

// logback의 경우
logger('org.hibernate.engine.jdbc.spi.SqlExceptionHelper', ERROR)
java/hibernate/4.txt · 마지막으로 수정됨: 2015/07/06 10:27 저자 kwon37xi