DataSource - 커넥션 풀

박찬우·2024년 2월 1일

스프링 DB

목록 보기
8/53

커넥션 풀

  • HikariCP 커넥션 풀을 사용한다.
  • HikariDataSourceDataSource 인터페이스를 구현하고 있다.
  • 커넥션 풀에서 커넥션을 생성하는 작업은 애플리케이션 실행 속도에 향을 주지 않기 위해 별도의 쓰레드에서 작동한다
  • 예)
@Test
void dataSourceConnectionPool() throws SQLException, InterruptedException {
	HikariDataSource dataSource = new HikariDataSource();
	dataSource.setJdbcUrl(ConnectionConst.URL);
	dataSource.setUsername(ConnectionConst.USERNAME);
	dataSource.setPassword(ConnectionConst.PASSWORD);
	dataSource.setMaximumPoolSize(10);
	dataSource.setPoolName("MyPool");

	useDataSource(dataSource);
}

private void useDataSource(DataSource dataSource) throws SQLException {
	Connection con1 = dataSource.getConnection();
	Connection con2 = dataSource.getConnection();
	log.info("connection={}, class={}", con1, con1.getClass());
	log.info("connection={}, class={}", con2, con1.getClass());
}
#커넥션 풀 초기화 정보 출력 
HikariConfig - MyPool - configuration: 
HikariConfig - maximumPoolSize................................10 
HikariConfig - poolName................................"MyPool"

#커넥션 풀 전용 쓰레드가 커넥션 풀에 커넥션을 10개 채움
[MyPool connection adder] MyPool - Added connection conn0: url=jdbc:h2:.. user=SA
...
[MyPool connection adder] MyPool - Added connection conn9: url=jdbc:h2:.. user=SA

#커넥션 풀에서 커넥션 획득1 
ConnectionTest - connection=HikariProxyConnection@446445803 wrapping conn0: 
url=jdbc:h2:tcp://localhost/~/test user=SA, class=class 
com.zaxxer.hikari.pool.HikariProxyConnection 
#커넥션 풀에서 커넥션 획득2 
ConnectionTest - connection=HikariProxyConnection@832292933 wrapping conn1: 
url=jdbc:h2:tcp://localhost/~/test user=SA, class=class 
com.zaxxer.hikari.pool.HikariProxyConnection

MyPool - After adding stats (total=10, active=2, idle=8, waiting=0)
  • HikariConfig
    • HikariCP 관련 설정을 확인할 수 있다. 풀의 이름( MyPool )과 최대 풀 수( 10 )을 확인할 수 있다.
  • MyPool connection adder
    • 별도의 쓰레드 사용해서 커넥션 풀에 커넥션을 채우고 있는 것을 확인할 수 있다. 이 쓰레드는 커넥션 풀에 커넥션을 최 대 풀 수( 10 )까지 채운다. 그렇다면 왜 별도의 쓰레드를 사용해서 커넥션 풀에 커넥션을 채우는 것일까? 커넥션 풀에 커넥션을 채우는 것은 상대적으로 오래 걸리는 일이다. 애플리케이션을 실행할 때 커넥션 풀을 채울 때 까 지 마냥 대기하고 있다면 애플리케이션 실행 시간이 늦어진다. 따라서 이렇게 별도의 쓰레드를 사용해서 커넥션 풀을 채 워야 애플리케이션 실행 시간에 영향을 주지 않는다.
  • 커넥션 풀에서 커넥션 획득
    • 커넥션 풀에서 커넥션을 획득하고 그 결과를 출력했다. 여기서는 커넥션 풀에서 커넥션을 2개 획득하고 반환하지는 않 았다. 따라서 풀에 있는 10개의 커넥션 중에 2개를 가지고 있는 상태이다. 그래서 마지막 로그를 보면 사용중인 커넥션 active=2 , 풀에서 대기 상태인 커넥션 idle=8 을 확인할 수 있다. MyPool - After adding stats (total=10, active=2, idle=8, waiting=0)
  • HikariCP 공식 사이트
profile
진짜 개발자가 되어보자

0개의 댓글