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 객체를 통해 출력한 정보들은 아래와 같은 의미를 가진다.
- SQL query execution counts: 현재 세션 또는 트랜잭션 중에 SQL 쿼리가 실행된 횟수를 카운트.
- Entity load counts: 현재 세션 또는 트랜잭션 중에 데이터베이스에서 엔티티가 로드된 횟수를 카운트.
- Transaction counts: 메트릭은 현재 세션 중에 시작된 트랜잭션 수를 카운트.
- Second-level cache hit counts: 최대 절전 모드가 데이터베이스가 아닌 두 번째 수준 캐시에서 엔티티를 검색한 횟수를 카운트.
- Flush counts: 현재 세션 동안 지속성 컨텍스트가 플러시된 횟수를 카운트.
- Connection request counts: 현재 세션 중 최대 절전 모드가 연결 풀에서 연결을 요청한 횟수를 카운트.
- Optimistic lock failure counts: 현재 세션 중 최대 절전 모드에서 최적 잠금 오류가 발생한 횟수를 카운트.
'spring boot' 카테고리의 다른 글
스프링 동작 흐름(참고용) (0) | 2021.07.25 |
---|---|
스프링 부트 테스트 코드 #3 (0) | 2021.05.17 |
스프링 부트 뷰와 컨트롤러 살펴보기 #2 (0) | 2021.05.17 |
스프링 부트 프로젝트 만들기 #1 (0) | 2021.05.17 |