현재 커넥션 수 확인하기
DB 커넥션 수가 제대로 동작하는지 확인하고 싶은 경우가 있다면
HikariDataSourcePoolMetadata
클래스를 이용해서 현재 사용 중인 커넥션 수를 확인할 수 있습니다.
30개의 스레드로 트랜잭션을 설정한 후 랜덤하게 지연시켜서 DB 커넥션 수 변화를 살펴보겠습니다.
@Test
void test() {
// 스레드 30개 생성
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(30);
executor.initialize();
// 트랝잭션 사용을 위한 정의
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.setReadOnly(true);
HikariDataSourcePoolMetadata metadata = new HikariDataSourcePoolMetadata(((HikariDataSource) dataSource));
List<CompletableFuture<Void>> futureList = IntStream.rangeClosed(0, 99)
.mapToObj(i -> CompletableFuture.runAsync(() -> {
log.info("현재 커넥션 수: {}", metadata.getActive());
transactionTemplate.executeWithoutResult(status -> {
try {
// 랜덤하기 시간 지연 시키기
TimeUnit.MILLISECONDS.sleep((int) (Math.random() * 200));
} catch (InterruptedException ignored) {
}
});
}, executor))
.collect(toList());
futureList.forEach(CompletableFuture::join);
}
실행 결과를 보면 커넥션 수가 계속해서 변경되는 것을 볼 수 있습니다.
현재 커넥션 수: 1
현재 커넥션 수: 6
현재 커넥션 수: 5
...
현재 커넥션 수: 7
현재 커넥션 수: 9
...
현재 커넥션 수: 7
현재 커넥션 수: 12
TransactionTemplate에 대해서는 여기, ThreadPoolTaskExecutor는 여기 에서 확인할 수 있습니다.
이렇게 코드로 확인하는 방법이 마음에 들지 않는다면 lsof를 이용해서 DB로 연결된 포트 수 통해서 확인할 수도 있습니다.
> lsof -nP -i :43306 -sTCP:ESTABLISHED | grep java
java 58180 user 125u IPv6 0xa8f784f29222eae7 0t0 TCP 127.0.0.1:57804->127.0.0.1:43306 (ESTABLISHED)
java 58180 user 126u IPv6 0xa8f784f292819407 0t0 TCP 127.0.0.1:57809->127.0.0.1:43306 (ESTABLISHED)
java 58180 user 127u IPv6 0xa8f784f29281c427 0t0 TCP 127.0.0.1:57810->127.0.0.1:43306 (ESTABLISHED)
java 58180 user 128u IPv6 0xa8f784f293432ae7 0t0 TCP 127.0.0.1:57811->127.0.0.1:43306 (ESTABLISHED)
java 58180 user 129u IPv6 0xa8f784f283cd9f67 0t0 TCP 127.0.0.1:57812->127.0.0.1:43306 (ESTABLISHED)
java 58180 user 130u IPv6 0xa8f784f2991e7ae7 0t0 TCP 127.0.0.1:57817->127.0.0.1:43306 (ESTABLISHED)
반복적으로 lsof를 실행해서 DB 커넥션 카운트를 확인할 수도 있습니다.
while :; do lsof -nP -i :43306 -sTCP:ESTABLISHED | grep java | wc -l; sleep 1; done
끝.
댓글남기기