[DB] 커넥션 풀과 HikariCP

개발하는자·2022년 2월 18일
0

DB

목록 보기
1/3
post-thumbnail
  1. 커넥션 풀이란?
  2. 커넥션 풀링의 장점
  3. DataSource
  4. DataSource 예제
  5. HikariCP

서버를 개발하게 되면 DB를 사용하는 것은 필수적이게 됩니다. 이때 내 서버가 DB와 어떤 방식으로 연결을 맺는지 궁금증이 생깁니다.

요청이 들어올 때마다 DB와 연결(connection) 하여 작업을 하는 방법이 있고 서버가 미리 DB와 연결을 해놓고 연결해 놓은 커넥션들을 하나씩 맺어주는 방법이 있습니다.

이번에는 두번째 방법인 커넥션 풀링 방법을 알아보겠습니다.



1. 커넥션 풀이란?


웹 서버 등에서 DB를 사용하기 위해 DB를 연결해놓은 커넥션들을 저장해놓은 장소를 커넥션 풀이라고 합니다.

기본적으로 커넥션은 생성 후 소멸되지만 커넥션 풀에 연결되어 있는 커넥션들을 만들어 놓으면 요청이 들어올 때 커넥션을 매치해 줄 수 있습니다.




2. 커넥션 풀링의 장점


  1. 성능
    커넥션들을 미리 만들어 놓기 때문에 성능을 향상시킬 수 있습니다.


스택오버플로우 답변을 인용하자면 접시를 사용하고 버릴 건지 설거지 후 다시 사용할 건지 고민하는 것에 비유했습니다. 커넥션을 연결하는 것은 접시를 새로 사는 것처럼 비용이 발생합니다. 😂


  1. 안정성
    여러 개의 커넥션들을 만들어놓고 정해진 커넥션에서 나눠주므로 안정적입니다.

  2. 비용
    새로 생성된 연결은 약 6MB ~ 10MB의 메모리를 사용합니다.



3. DataSource (JDBC)

JDBC에서는 커넥션 풀을 만들 수 있는 DataSource라는 훌륭한 인터페이스를 해공해줍니다.

DataSource 인터페이스를 살펴보면 아래와 같이 3가지 방법으로 구현할 수 있습니다.

  1. 기본 구현 - 표준 연결 오브젝트를 생성합니다.
  2. 연결 풀링 구현 - 연결 풀링에 자동으로 참여하는 연결 오브젝트를 생성합니다. 이 구현체는 중간 계층 연결 풀링 관리자와 함께 작동합니다.
  3. 분산 트랜잭션 구현 - 분산 트랜잭션에 사용할 수 있고 거의 항상 연결 풀링에 참여하는 연결 오브젝트를 생성합니다. 이 구현체는 중간 계층 트랜잭션 관리자와 함께 작동하며 거의 항상 연결 풀링 관리자와 함께 작동합니다.




4. DataSource 예제


커넥션 연결 ( Spring )

	@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 )

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가 풀에서 유지하려고 하는 유효 연결의 최소 수를 제어합니다.




5. 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

profile
To the moon.

0개의 댓글