포스트

2. connection pool

2. connection pool

Connection Pool(23. 12. 01)

데이터 베이스에 접근하기 위한 패턴

  • 미리 Connection 객체를 생성하여 Pool 또는 Container에 배치
  • • Application에서 Connection 객체가 필요할 때, 새로운 객체를 생성하는 대신 Pool에서 해당 객체를 가져와 사용하고 재사용을 위해서 사용된 객체는 Pool에 반납합니다.

Untitled

장점

  • 데이터베이스에 Connection을 생성할때 소요되는 시간 및 자원을 줄일 수 있습니다.
  • Connection 수를 제한 할 수 있어 과다한 접속으로 인한 서버 자원 고갈을 예방합니다.
  • 메모리 영역에서 Connection을 관리하기 때문에 클라이언트가 데이터베이스 작업을 빠르게 진행할 수 있습니다.

Connection Pool 구현?

*1. DataBase Driver를 사용하여 DataBase 연결

  1. 데이터 읽기/쓰기 위한 TCP/Socket Open
  2. Socket을 통해서 데이터 읽기/쓰기
  3. DataBase 연결 닫기
  4. TCP/Socket Close*

이전까지는 close() 하면 Connection을 Close 했지만 이젠 자신을 반환(pool에) 하는 방식으로 바꾼다.

1
connection.close() -> PoolableConnection.close()

Apache Commons DBCP

  • DBCP2 는 Apache Commons Pool 기반으로 한다.
  • Maven

    1
    2
    3
    4
    5
    
      <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-dbcp2</artifactId>
          <version>2.11.0</version>
      </dependency>
    

최적화

WAS == Tomcat 은 Thread Pool을 사용

  • Default = 200개
    • 즉 tomcat 기본설정을 사용한다면 동시에 최대 200개까지 처리할 수 있음
    • DBCP parameter를 WAS의 Thread Pool Size로 고정하여 최적화.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
      BasicDataSource basicDataSource = new BasicDataSource();
          basicDataSource.setUrl("jdbc:mysql://133.186.241.167:3306/nhn_academy_100");
          basicDataSource.setUsername("nhn_academy_100");
          basicDataSource.setPassword("1jaOTakgkS1$dWl2");
          basicDataSource.setInitialSize(200);
          basicDataSource.setMaxTotal(200);
          basicDataSource.setMaxIdle(200);
          basicDataSource.setMinIdle(200);
        
          basicDataSource.setMaxWait(Duration.ofSeconds(2));
          basicDataSource.setValidationQuery("select 1");
          basicDataSource.setTestOnBorrow(true);
    

DataSource

  • 기존의 DriverManager를 통해 DB Connection을 얻는 것보다 더 좋은 기법
    • 서버에서 관리하기에 DB 변경이 수월하다.
    • Connection, Statement 객체를 pooling 할 수 있다.
  • apache META-INFcontext.xml 에 다음과 같은 코드 추가

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
      <?xml version="1.0" encoding="UTF-8"?>
      <Context>
        
          <!-- Default set of monitored resources. If one of these changes, the    -->
          <!-- web application will be reloaded.                                   -->
          <WatchedResource>WEB-INF/web.xml</WatchedResource>
          <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
          <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
        
          <Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"
                    maxTotal="5" maxIdle="5" maxWaitMillis="10000"
                    username="nhn_academy_0" password="1234"
                    driverClassName="com.mysql.cj.jdbc.Driver"
                    url="jdbc:mysql://localhost:3306/nhn_academy_0"
                    closeMethod="close" />
        
      </Context>
    
    • context.xml 없으면 프로젝트 구조 가서 만들자.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.