본문 바로가기
spring boot

hibernate.generate_statistics=ture

by 킹차니 2023. 2. 21.
spring:
  jpa:
    properties:
      hibernate:
        generate_statistics: true

위와 같이 해당 설정을 true로 설정하면 hibernate는 런타임 동안 성능 및 동작과 관련된 다양한 메트릭을 수집한다. 이러한 메트릭은 잠재적인 성능 문제를 식별하고 최대 절전 모드가 데이터베이스와 상호 작용하는 방식을 이해하는 데 매우 유용하게 사용될 수 있다. 

 

위와 같이 설정한 뒤 아래와 같이 SessionFactory의 Statistics 객체를 사용하면 현재 최대 절전 모드 세션 또는 트랜잭션 중에 데이터베이스에서 엔티티가 로드된 횟수를 가져온다. 

 

특정 엔티티를 생성하고 save하는 메서드가 있다고 하자. 아래와 같이 할 수 있다.

    @Transactional
    public ResponseEntity<ResponseDTO> create(RequestDTO requestDTO){
    
        SessionFactory sessionFactory = emf.unwrap(SessionFactory.class);
        Statistics statistics = sessionFactory.getStatistics();
        
      	// 특정 엔티티를 find, save 하는 service 로직...
        
        long queryExecutionCount = statistics.getQueryExecutionCount();
        long networkCommunicationCount = statistics.getEntityLoadCount();
        long transactionCount = statistics.getTransactionCount();
        long secondLevelCacheHitCount = statistics.getSecondLevelCacheHitCount();
        long flushCount = statistics.getFlushCount();
        long connectCount = statistics.getConnectCount();
        long optimisticFailureCount = statistics.getOptimisticFailureCount();
        System.out.println("queryExecutionCount = " + queryExecutionCount);
        System.out.println("networkCommunicationCount = " + networkCommunicationCount);
        System.out.println("transactionCount = " + transactionCount);
        System.out.println("secondLevelCacheHitCount = " + secondLevelCacheHitCount);
        System.out.println("flushCount = " + flushCount);
        System.out.println("connectCount = " + connectCount);
        System.out.println("optimisticFailureCount = " + optimisticFailureCount);

        return ResponseEntity.OK(ResponseDTO.toDTO(something));
    }

 

queryExecutionCount = 0
entityLoadCount = 2
transactionCount = 0
secondLevelCacheHitCount = 0
flushCount = 0
connectCount = 1
optimisticFailureCount = 0
2023-02-21 14:08:18.424  INFO 90656 --- [nio-8040-exec-2] c.e.g.u.i.RequestLogInterceptor          : response status: 200 / time :1676956098424
2023-02-21 14:08:18.424  INFO 90656 --- [nio-8040-exec-2] i.StatisticalLoggingSessionEventListener : Session Metrics {
    794198 nanoseconds spent acquiring 1 JDBC connections;
    0 nanoseconds spent releasing 0 JDBC connections;
    429625 nanoseconds spent preparing 8 JDBC statements;
    5760998 nanoseconds spent executing 8 JDBC statements;
    0 nanoseconds spent executing 0 JDBC batches;
    0 nanoseconds spent performing 0 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    0 nanoseconds spent performing 0 L2C misses;
    10566373 nanoseconds spent executing 1 flushes (flushing a total of 6 entities and 15 collections);
    0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections)

 

statistics 객체를 통해 출력한 정보들은 아래와 같은 의미를 가진다.

  1. SQL query execution counts: 현재 세션 또는 트랜잭션 중에 SQL 쿼리가 실행된 횟수를 카운트.
  2. Entity load counts: 현재 세션 또는 트랜잭션 중에 데이터베이스에서 엔티티가 로드된 횟수를 카운트.
  3. Transaction counts: 메트릭은 현재 세션 중에 시작된 트랜잭션 수를 카운트.
  4. Second-level cache hit counts: 최대 절전 모드가 데이터베이스가 아닌 두 번째 수준 캐시에서 엔티티를 검색한 횟수를 카운트.
  5. Flush counts: 현재 세션 동안 지속성 컨텍스트가 플러시된 횟수를 카운트.
  6. Connection request counts: 현재 세션 중 최대 절전 모드가 연결 풀에서 연결을 요청한 횟수를 카운트.
  7. Optimistic lock failure counts: 현재 세션 중 최대 절전 모드에서 최적 잠금 오류가 발생한 횟수를 카운트.