tomcat.apache.org의 공식 문서 중 JNDI 예제입니다. (2017년 9월, 재확인하였는데 동일합니다)

<Context ...>
  ...
  <Resource name="jdbc/EmployeeDB"
            auth="Container"
            type="javax.sql.DataSource"
            username="dbusername"
            password="dbpassword"
            driverClassName="org.hsql.jdbcDriver"
            url="jdbc:HypersonicSQL:database"
            maxActive="8"
            maxIdle="4"/>
  ...
</Context>

 

주요 항목에 대해서 설명해 보겠습니다.

우선 commons-dbcp에서 제공하는 항목입니다. 일부는 dbcp 소스와 함께 설명합니다.

  • name

필수 항목으로서 root java context 인 java:comp/env 에 상대적인 resource 이름이며 jdbc/ 로 시작 (예를 들어 jdbc/sarc)

  • auth

resource manager 에 sign on 하는 주체로 Container (container-managed 일 경우) 혹은 Application (application-managed 일 경우)

  • scope

resource 가 공유 될 수 있는지 여부로 Shareable 혹은 Unshareable 이며, default 는 Shareable

  • initialSize

초기 connection 수로, default 는 0 이며, BasicDataSource.java 에서 private int initialSize = 0; 으로 정의됨됨

  • maxActive

동시 사용 가능한 connection 수로 0 일 경우 무제한이며, default 는 8

  • minIdle

maxActive 를 넘을 수 없으므로 때에 따라 idle connection 이 minIdle 보다 적을 수도 있고, -1 일 경우 무제한이며, default 는 0

  • maxIdle

dle connection 의 최대 개수로, default 는 8

  • maxWait

새로운 connection 을 얻기 위해 대기하는 시간 (msec) 으로, 이 시간에 도달하게 되면 exception 이 발생하며, default 는 -1 로 무제한

  • validationQuery

connection 유효성 체크 query 로 default 는 null 이다. 만일 MySQL/MariaDB/PPAS/PostgreSQL 에 적용하려면 select 1, Oracle 에 적용하려면 select 1 from dual 을 사용한다.

BasicDataSource.java 내 로직은 다음과 같다.

    public void setValidationQuery(String validationQuery) {
        if (validationQuery != null &amp;&amp; validationQuery.trim().length() > 0) {
            this.validationQuery = validationQuery;
        } else {
            this.validationQuery = null;
        }
    }

 위 코드는 다음과 같이 연결된다. PoolableConnectionFactory.java 파일이다.

    public void validateConnection(PoolableConnection conn) throws SQLException {
        if(conn.isClosed()) {
            throw new SQLException("validateConnection: connection closed");
        }
        conn.validate(_validationQuery, _validationQueryTimeout);
    }

 

  • validationQueryTimeout

default는 -1 이며 , BasicDataSource.java 에서 private volatile int validationQueryTimeout = -1; 로 정의되어 있다.

  • testWhileIdle

idle connection 대상으로 validationQuery를 수행하여 문제가 발생할 경우 pool 에서 제거한다. 그리고 그 주기는 timeBetweenEvictionRunsMillis인데 물론 validationQuery 가 우선한다.

  • minEvictableIdleTimeMillis

이 시간이 지난 idle connection 을 대상으로 minIdle 수에 도달할 때까지 pool 에서 제거하며, default는 60000 (msec)

  • testOnBorrow

default 는 false 이며, pool 에서 꺼내기 전에 validationQuery 를 수행한다. validationQuery는 null 이 아니어야 한다.

  • testOnReturn

default 는 false 이며, pool 에 반납하기 전에 validationQuery 를 수행한다. validationQuery는 null 이 아니어야 한다.

 

다음은 org.apache.tomcat.jdbc.pool.DataSource 에서 제공하는 추가적인 항목입니다.

  • initSQL

connection 이 최초 생성될 때 실행되는 query 로 default 는 null

  • validationInterval

이 시간 안에는 validationQuery 를 하지 않으며, default 는 30000 (msec)

 

도큐멘트에 따르면 DB 와 연결되는 시점, 즉 initialSize 만큼의 connection 이 pool 에 생성되는 시점은 아래와 같이 DataSource 설정을 어느 곳에 했느냐에 따라 달라집니다.

  • GlobalNamingResources 에 설정한 경우 Tomcat 인스턴스를 기동할 때 생성
  • context 에 설정한 경우 첫 request 가 들어올 때 생성

그러나 테스트 결과 모두 Tomcat 기동 시 생성되는 것으로 확인되었습니다.