Connection Pool, Hikari

ho's·2022년 7월 29일
0

브라우저가 웹 어플리케이션에게 HTTP프로토콜을 보내고, 웹 어플리케이션은 SQL문을 통해서 DBMS와 데이터를 주고 받는다.

  • 만약 많은 브라우저가 WAS에게 요청을 한다면, WAS는 Thread를 이용해서 관리해야 한다.

  • 즉 WAS가 요청을 받아서 Thread로 Servlet을 실행한다.

  • DB에 접속하는 것은 Connection을 이용하는데, 하나의 DBMS는 처리량에 대해 한계가 있고, Connection의 수도 한계가 있다.

  • 즉 Connection을 무수히 많이 생성하는게 아니라 Connection을 어떻게 관리해아 하는가에 대한 생각을 하게 된다.

Connection Pool의 등장

  • 미리 Connection을 연결해 놓는다.

  • 즉 요청이 들어올 때, WAS가 DBMS에 직접 연결하는 것이 아니라, Connection Pool을 이용해 미리 DBMS에 연결해 놓은 Connection을 사용하는 것이다.

  • 만약 위의 예처럼 커넥션풀에 커넥션을 20개 생성했다고 했을 때, 25개의 요청이 들어왔다고 생각해보자.
    이는 어떻게 처리하는게 좋을까?
  1. 커넥션풀을 새로 생성한다.
  2. 커넥션풀을 만드는 것은 메모리에 대한 것이므로 신중해야 한다. 그냥 기다린다

2번이 좋은 방법이겠다. 예를 들어 우리가 수강신청과 티켓팅을 할때를 생각해 보자.
브라우저가 WAS에게 많은 양의 요청을 했다. WAS가 만들어 놓은 Connection Pool의 Connection의 수를 초과해 요청이 들어왔으므로, 앞의 요청이 끝날때 까지 기다려야 한다.

위와 같은 문제를 해결하기 위한다고 커넥션풀을 사용하지 않는다고 하면, DBMS는 아예 죽어 버린다.

성능을 높이는 방법은

  1. DBMS의 크기를 늘린다.
  2. DBMS의 개수를 늘린다.

HikariCP

  • Connection Pool 오픈 소스 중에서 인기있는 API이다.

  • 검색해보자.

HikariCP는 그레이들 빌드환경에서 위와 같은 코드를 입렭하면 사용 할 수 있다.

위와 같이 dependencies에 추가해 주도록 하자.

Connection Pool은 메모리에 한 개 씩 존재하도록 하자.

코드를 작성해보자.

Hikari 웹 사이트에서 위와 같은 것이 있다.

     static{
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/testdb");
        config.setUsername("db아이디");
        config.setPassword("db비밀번호");
        config.setMaximumPoolSize(20);   // 커넥션풀 사이즈
        config.setAutoCommit(false);

        ds = new HikariDataSource(config);

        // JVM이 종료 될때 자동으로 실행될 메소드를 지정한다.
        Runtime.getRuntime().addShutdownHook(new Thread());
    }
  • static 지역에 HikariConfig를 만든다. 그 이유는 static 필드는 static필드에 한번만 실행되기 때문.
  • HikariConfig 객체 config를 만든다.
  • config.setJdbUrl, config.setUsername, config.Password, config.setMaximumPoolSize, config.setAutoCommit등을 이용해 config객체를 설정한다.
  • HikariDataSource를 통해 ds에 넣는다.

Hikari를 통해 DBMS에 연결을 했으니, 기존의 getConnection의 코드 또한 바뀌게 된다.
어떻게 바뀌는지 확인해 보자.

기존 getConnection 메소드

바뀐 getConnection 메소드

테스트 클래스에서 실행시켜보면..

현재 Connection Pool에 Connection을 20개 만들어 사용했지만, 단일 스레드를 사용하고 있기 때문에 하나의 커넥션만 사용하고 있다.

다음엔 Tomcat, WebApplication Server, Servlet에 대해 알아보도록 하자.

profile
그래야만 한다

0개의 댓글