- 커넥션 풀이란?
- 커넥션 풀링의 장점
- DataSource
- DataSource 예제
- HikariCP
서버를 개발하게 되면 DB를 사용하는 것은 필수적이게 됩니다. 이때 내 서버가 DB와 어떤 방식으로 연결을 맺는지 궁금증이 생깁니다.
요청이 들어올 때마다 DB와 연결(connection) 하여 작업을 하는 방법이 있고 서버가 미리 DB와 연결을 해놓고 연결해 놓은 커넥션들을 하나씩 맺어주는 방법이 있습니다.
이번에는 두번째 방법인 커넥션 풀링 방법을 알아보겠습니다.
웹 서버 등에서 DB를 사용하기 위해 DB를 연결해놓은 커넥션들을 저장해놓은 장소를 커넥션 풀이라고 합니다.
기본적으로 커넥션은 생성 후 소멸되지만 커넥션 풀에 연결되어 있는 커넥션들을 만들어 놓으면 요청이 들어올 때 커넥션을 매치해 줄 수 있습니다.
스택오버플로우 답변을 인용하자면 접시를 사용하고 버릴 건지 설거지 후 다시 사용할 건지 고민하는 것에 비유했습니다. 커넥션을 연결하는 것은 접시를 새로 사는 것처럼 비용이 발생합니다. 😂
안정성
여러 개의 커넥션들을 만들어놓고 정해진 커넥션에서 나눠주므로 안정적입니다.
비용
새로 생성된 연결은 약 6MB ~ 10MB의 메모리를 사용합니다.
JDBC에서는 커넥션 풀을 만들 수 있는 DataSource라는 훌륭한 인터페이스를 해공해줍니다.
DataSource 인터페이스를 살펴보면 아래와 같이 3가지 방법으로 구현할 수 있습니다.
@Autowired
private DataSource dataSource;
@GetMapping("/")
public String test() throws SQLException {
System.out.println("getConnection...");
Connection connection = dataSource.getConnection();
System.out.println("disconnect!");
connection.close();
return "ok";
}
위 코드를 실행 하면
DataSource를 사용해 connection을 맺을 수 있습니다.
HikariCP 구현체를 사용해 DataSource를 빈에 등록할 수 있습니다.
@Configuration
public class DataSourceConfig {
@Bean
DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/connectionpool?serverTimezone=UTC");
config.setUsername(" db 이름 ");
config.setPassword(" db 비밀번호 ");
config.setDriverClassName("com.mysql.cj.jdbc.Driver");
config.setMaximumPoolSize(20);
config.setMinimumIdle(10);
DataSource dataSource = new HikariDataSource(config);
return dataSource;
}
}
setMaximumPoolSize : 최대 풀 사이즈.
setMinimumIdle : HikariCP가 풀에서 유지하려고 하는 유효 연결의 최소 수를 제어합니다.
JDBC connection pool 중 하나이며 빠르고 간단하다는 장점이 있습니다.
히카리(光, ひかり)는 일본어로 빛을 뜻합니다. 2012년경 Brett Wooldridge가 개발했습니다. HikariCP github
아래 사진은 HikariCP의 성능을 c3p0 , dbcp2 , tomcat, vibur 과 같은 다른 풀링 프레임워크와 비교한 결과입니다.
참고 링크
https://stackoverflow.com/questions/457287/what-is-the-benefit-of-connection-and-statement-pooling
https://medium.com/@rajchandak1993/understanding-hikaricps-connection-pooling-behaviour-467c5a1a1506
https://www.javadoc.io/doc/com.zaxxer/HikariCP/2.6.3/com/zaxxer/hikari/HikariConfig.html