Dev/Spring

[ Spring 설정 ] DataSource (DBCP) 설정

surimi🍥 2021. 2. 24. 23:24
반응형

JDBC 커넥션 풀을 지원하는 대표적인 오픈소스 중에 아파치 DBCP와 C3P0가 있다. 이들은 Spring, Hibernate 등과 통합되어 DB 커넥션 풀을 제공하는 DataSource를 구성하여 자주 쓰인다.

오라클이나 MySQL 등 DBMS들은 기본적으로 특정 시간동안 실행이 없으면 해당 세션을 종료하게 된다. 이렇게 종료된 커넥션은 어플리케이션에서 오류를 발생시키게 되므로 커넥션을 유지하기 위한 별도 설정을 필요로 하게 된다. 커넥션을 얻어올 때 커넥션 테스트를 수행하고 실패하면 새로운 커넥션을 생성할 수 있다. 또한 idle 타임에 주기적으로 커넥션 테스트를 수행할 수도 있다.

 

전자정부 표준프레임워크에서는

데이터베이스와의 연결풀을 설정하는 DataSource 설정에

Apache Common DBCP(Database Connection Pool)을 사용하고 있다.

 

전자정부 표준프레임워크의 DataSource 기본 설정

    <!-- Oracle -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${Globals.DriverClassName}"/>
        <property name="url" value="${Globals.Url}"/>
        <property name="username" value="${Globals.UserName}"/>
        <property name="password" value="${Globals.Password}"/>
    </bean>

property의 value 에 들어가는 항목들은 globals.properties 파일에서 정의하고 있다.

 

# globals.properties

  ${Globals.DriverClassName} - oracle.jdbc.driver.OracleDriver (JDBC 드라이브 클래스 이름)
  ${Globals.Url} - jdbc:log4jdbc:oracle:thin:@127.0.0.1:1521:XE (데이터베이스 연결 URL)
  ${Globals.UserName} - xeuser (사용자 아이디)
  ${Globals.Password} - xeuser (사용자 비밀번호)

데이터베이스 연결 풀(Connection Pool)은 데이터베이스와의 연결을 미리 만들어 두고, 사용함으로서

네트웍 연결작업에 의한 지연을 줄여 주기위해 사용한다.

 

    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url" value="jdbc:log4jdbc:oracle:thin:@127.0.0.1:1521:XE"/>
        <property name="username" value="xeuser"/>
        <property name="password" value="xeuser"/>

        <!-- default 설정 -->
        <property name="initialSize" value="0"/>
        <property name="maxTotal" value="8"/>
        <property name="maxIdle" value="8"/>
        <property name="minIdle" value="0"/>
        <property name="maxWaitMillis" value="-1"/>
    </bean>

# initialSize - 연결 풀이 최초 생성될 때 같이 이 숫자만큼 데이터베이스 연결을 미리 생성한다. 기본값은 0.

 

# maxTotal- 동시에 사용할 수 있는 최대 연결의 갯수. 기본값은 8.

음수를 입력하면 연결 갯수에 제한이 없다.

만약 이 갯수를 초과하여 요청이 들어오면 최대 maxWaitMills만큼 대기하고,

그래도 연결을 사용할 수 없을 때는 예외를 발생시킨다.

 

# maxIdle - 풀에서 사용되지 않은 상태로 존재할 수 있는 최대 연결의 숫자. 음수면 제한이 없다. 기본값은 8.

maxTotal10 이고, maxIdle이 8일 때 10개의 연결이 모두 사용되고 있는 상태를 가정해보자. 연결이 사용을 마치고 하나씩 반환이 되면, maxIdle 숫자인 8개가 될때까지는 유휴 상태로 풀에 남겨진다. 아홉번째 부터는 연결이 해제되어 제거 됩니다. 모두 반환된후에 풀에는 유휴상태인 8개의 연결이 남아 있다.

 

# minIdle - 풀에서 사용되지 않은 상태로 존재할 수 있는 최소 연결의 숫자이다. 기본 값은 0.

풀을 관리하는 쓰레드는 풀 내의 유휴 연결의 최소 갯수를 이 값으로 유지한다. 주로 발생하는 상황은 오류가 발생한 연결이나, 사용되지 않고 오래된 연결은 풀에서 제거된다. 이 경우 풀내의 연결의 갯수가 minIdle 이하로 떨어지면

새로 생성해서 minIdle 갯수에 맞추게 된다.

 

# maxWaitMills- 풀에 사용 가능할 연결이 없을때 대기하는 최대 시간을 밀리초 단위로 나타냅니다. 이 대기시간후에도 사용 가능한 연결이 없으면 예외를 발생합니다. -1은 무한대기를 나타냅니다. 기본값은 -1입니다.

 

 

Maven Dependency

org.apache.commons.dbcp2.BasicDataSource사용하려면 pom.xml에 이 dependency를 추가하거나

jar 파일을 build path 시켜주면 된다.

    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-dbcp2</artifactId>
      <version>2.8.0</version>
    </dependency>

 

validationQuery

DB에 접속중인 세션을 오랫동안 사용하지 않거나, 네트워크에 문제가 발생하는 경우 DB 세션이 끊어질 수 있다.

DB 세션이 끊어지는 경우 App 입장에서는 재접속 처리를 해주어야 다시 정상적인 서비스가 가능해 진다.

 

mysql wait_timeout 설정(기본값 28800 , 8시간) 에 의해 커넥션이 연결된 이후 해당커넥션의 close 없이 8시간이 지나면 해당 커넥션을 종료 시키게 된다.
문제는 이렇게 종료된 커넥션을 dbcp의 connection pool 에선 여전히 가지고 있는 상태라는 것이다.이런 상황에서 DB 관련 프로그램이 호출되면 커넥션 관련 에러가 발생된다.
해결방법은 java에서 DB를 사용하기 전에 해당 connection 이 정상적인지 검사를 하도록 하는 것이다. 이 옵션이 validationQuery 파라미터이다.

 

<property name="defaultAutoCommit" value="true"/>
<property name="validationQuery" value="SELECT 1 FROM DUAL"/>
<property name="testOnBorrow" value="true"/>
<property name="testOnReturn" value="false"/>
<property name="testWhileIdle" value="true"/>
<property name="timeBetweenEvictionRunsMillis" value="60000"/>

validationQuery : 특정 시간마다 커넥션을 확인.  select 1 from dual; 의 반환값은 1이다.

 

 

DBCP 설정 관련 apache 문서 : http://commons.apache.org/dbcp/configuration.html

출처: [MySQL] DBCP validationQuery 설정|작성자 마루아라

출처: https://offbyone.tistory.com/161 [쉬고 싶은 개발자]

참고: www.cubrid.com/tutorial/3793513

 

 

반응형