-
스프링 DB - DataSource 예제2 - 커넥션 풀Data Base/스프링 DB 2023. 11. 23. 11:50
DataSource 예제2 - 커넥션 풀
DataSource를 통해 커넥션 풀을 사용하는 예제를 알아보자
ConnectionTest 데이터소스 커넥션 풀 추가
@Test void dataSourceConnectionPool() throws SQLException, InterruptedException { //Spring에서 JDBC사용하면 자동으로 임포트된다. //커넥션 풀링 HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl(URL); dataSource.setUsername(USERNAME); dataSource.setPassword(PASSWORD); dataSource.setMaximumPoolSize(10); dataSource.setPoolName("MyPool"); useDataSource(dataSource); Thread.sleep(1000); }
- HikariCP 커넥션 풀을 사용한다 HikariDataSource는 DataSource 인터페이스를 구현하고 있다.
- 커넥션 풀 최대 사이즈를 10으로 시정한고, 풀의 이름을 MyPool이라고 지정했다.
- 커넥션 풀에서 커넥션을 생성하는 작업은 애플리케이션 실행 속도에 영향을 주지 않기 위해 별도 쓰레드에서 작동한다. 별도의 쓰레드에서 동작하기 때문에 테스트가 먼저 종료되어 버린다. 예제처럼 Tread.sleep을 통해 대기 시간을 주어야 쓰레드 풀에 커넥션이 생성되는 로그를 확인할 수 있다.
실행결과
(로그 순서는 이해가 쉽게 약간 수정)
#커넥션 풀 초기화 정보 출력
#커넥션 풀 전용 쓰레드가 커넥션 풀에 커넥션을 10개 채움
#커넥션 풀에서 커넥션 획득1
ConnectionTest - connection = HikariProxyConnection@94830685 wrapping conn2: url=jdbc:h2:tcp://localhost/~/test user=SA , class = class com.zaxxer.hikari.pool.HikariProxyConnection
#커넥션 풀에서 커넥션 획득2
ConnectionTest - connection = HikariProxyConnection@1539947037 wrapping conn3: url=jdbc:h2:tcp://localhost/~/test user=SA , class = class com.zaxxer.hikari.pool.HikariProxyConnection
실행 결과를 분석해보자
HikariConfig
HikariCP 관련 설정을 확인할 수 있다. 풀의 이름(My Pool)과 최대 풀 수 (10)을 확인할 수 있다.
MyPool connection adder
별도의 쓰레드 사용해서 커넥션 풀에 커넥션을 채우고 있는 것을 확인할 수 있다. 이 쓰레드는 커넥션 풀에 커넥션을 최대 풀 수(10)까지 채운다.
그렇다면 왜 별도의 쓰레드를 사용해서 커넥션 풀에 커넥션을 채우는 것일까?
커넥션 풀에 커넥션을 채우는 것은 상대적으로 오래 걸리는 일이다. 애플리케이션을 실행할 때 커넥션 풀을 채울 때 까지 마냥 대기하고 있다면 애플리케이션 실행 시간이 늦어진다. 따라서 이렇게 별도의 쓰레드를 사용해서 커넥션 풀을 채워야 애플리케이션 실행 시간에 영향을 주지 않는다.
커넥션 풀에서 커넥션 획득
커넥션 풀에서 커넥션을 획득하고 그 결과를 출력했다. 여기서는 커넥션 풀에서 커넥션을 2개 획득하고 반환하지는 않았다. 따라서 풀에 있는 10개의 커넥션 중에 2개를 가지고 있는 상태이다. 그래서 마지막 로그를 보면 사용중인 커넥션 active=2 풀에서 대기 상태인 커넥션 idle = 8을 확인 할 수 있다.
- 커넥션 풀에 커넥션이 채워지기 전에 커넥션을 획득을 요청 하면 어떻게 될까?
- ➡️ 커넥션 풀이 채워지 기다렸다가 커넥션 풀이 다차면 dataSource.getConnection에서 요청한 커넥션을 반환 받을 수 있다.
- 커넥션 풀 맥시먹 사이즈인 10개의 커넥션 풀 초과해서 커넥션을 요청하면 어떻게 될까?
- ➡️ MyPool - Pool stats (total=10, active=10, idle=0, waiting=1)
➕참고
https://github.com/brettwooldridge/HikariCP[출저 - 스프링 DB 1편 - 데이터 접긎 핵심 원리, 김영한]
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1
'Data Base > 스프링 DB' 카테고리의 다른 글
스프링 DB - 데이터 페이스 연결 구조와 DB세션 (0) 2023.11.23 스프링 DB - 트랜잭션 이해 (1) 2023.11.23 스프링 DB - DataSource 예제1 - DriverManager (0) 2023.11.23 스프링 DB - DataSource의 이해 (0) 2023.11.21 스프링 DB 1 - 커넥션 풀 과 데이터 소스 이해 (0) 2023.11.21