DB 공부를 하다 DB에 접근하는 방법 2가지를 알아보았습니다.
정리를 하면 더 좋을것 같아서 블로그에 포스팅하기로 하였습니다.
DriverManager, Connection Pool를 이용하여 DB의 Connction을 얻는 과정을 진행해 보겠습니다.
우선 DriverManager와 Connection Pool에 대한 개념을 알아보겠습니다.
스프링에서 제공하는 DriverManager입니다.
매 SQL요청마다 커넥션을 생성하지 않고 미리 커넥션을 만들어 놓는 방법입니다.
저는 대표적인 오픈소스 hikariCP 를 사용할 것입니다.
@Slf4j
public class ConnectionTest {
@Test
void driverManager() throws SQLException {
Connection con1 = DriverManager.getConnection(URL, USERNAME, PASSWORD);
Connection con2 = DriverManager.getConnection(URL, USERNAME, PASSWORD);
log.info("connection={}, class={}", con1 ,con1.getClass());
log.info("connection={}, class={}", con2 ,con2.getClass());
}
@Test
void dataSourceDriverManager() throws SQLException {
//스프링이 제공하는 Driver DataSource - 항상 새로운 커넥션을 흭득
//설정과 사용의 분리를 하여 코드 작성을 편하게 할 수 있습니다.
DataSource dataSource = new DriverManagerDataSource(URL, USERNAME, PASSWORD);
userDataSource(dataSource);
}
private void userDataSource(DataSource dataSource) throws SQLException {
Connection con1 = dataSource.getConnection();
Connection con2 = dataSource.getConnection();
log.info("connection={}, class={}", con1 ,con1.getClass());
log.info("connection={}, class={}", con2 ,con2.getClass());
}
}
driverManager()
dataSourceDriverManager()
@Test
void dataSourceConnectionPool() throws SQLException, InterruptedException {
//커넥션 풀링
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl(URL);
dataSource.setUsername(USERNAME);
dataSource.setPassword(PASSWORD);
dataSource.setMaximumPoolSize(10);
dataSource.setPoolName("MyPool");
useDataSource(dataSource);
Thread.sleep(1000);
}
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 ,con2.getClass());
}
HikariDataSource
를 생성하여 연결조회를 한 결과입니다.
17:48:06.852 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn2: url=jdbc:h2:tcp://localhost/~/test user=SA
17:48:06.854 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn3: url=jdbc:h2:tcp://localhost/~/test user=SA
17:48:06.857 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn4: url=jdbc:h2:tcp://localhost/~/test user=SA
17:48:06.860 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn5: url=jdbc:h2:tcp://localhost/~/test user=SA
17:48:06.863 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn6: url=jdbc:h2:tcp://localhost/~/test user=SA
17:48:06.866 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn7: url=jdbc:h2:tcp://localhost/~/test user=SA
17:48:06.868 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn8: url=jdbc:h2:tcp://localhost/~/test user=SA
17:48:06.872 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn9: url=jdbc:h2:tcp://localhost/~/test user=SA
17:48:06.872 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - After adding stats (total=10, active=2, idle=8, waiting=0)
[MyPool connection adder]
이라는 스레드가 커넥션을 생성한 것을 확인 할 수 있습니다.
After adding stats (total=10, active=2, idle=8, waiting=0)
에서 스레드가 몇개 생성이 되고 사용되고있는지 확인 할 수 있습니다.
Connection Pool의 스레드가 전부 사용중이면 요청은 대기하게됩니다.
이때 얼마나 대기해야할지는 개발자가 상황에 맞게 잘 정해놓아야 합니다.