본문 바로가기

미들웨어/Apache,Tomcat

Tomcat JNDI DataSource 설정

반응형

이번 포스팅에서는 Tomcat에 DataSource 설정을 통해 DB와의 연동설정을 설명한다.


1. DataSource 설정

  • $CATALINA_BASE/conf/server.xml의 <GlobalNamingResources>태그안에 DataSource설정을 추가한다.
  • <Context>태그안에 Context별로 사용할 DataSource를 지정한다. 
  • server.xml
<GlobalNamingResources>
  <Resource name="jdbc/maria" auth="Container" type="javax.sql.DataSource"
              username="test"
              password="password"
              url="0.0.0.0"
              driverClassName="org.mariadb.jdbc.Driver"
              maxTotal="50"
              maxIdle="50"
              minIdle="50"
              maxWaitMillis="5000"
              initialSize="50"
        />
</GlobalNamingResources>
  
<Context docBase="/webwas/test" path="" reloadable="false" >
  <ResourceLink name="jdbc/maria" global="jdbc/maria" type="javax.sql.DataSource" />
</Context>
 

Apache Tomcat 8 (8.5.86) - The Tomcat JDBC Connection Pool

The connection pool object exposes an MBean that can be registered. In order for the connection pool object to create the MBean, the flag jmxEnabled has to be set to true. This doesn't imply that the pool will be registered with an MBean server, merely tha

tomcat.apache.org

  • 추가로 Tomcat은 tomcat-dbcp.jar와 tomcat-jdbc.jar라는 두가지 DataSource방식을 제공한다.
    어떤 library를 사용하느냐에 따라 옵션값이 다르기 때문에 확인이 필요하다.(default : tomcat-dbcp.jar)

 

2. DB 패스워드 암호화

  • 설정에는 DB 패스워드 정보가 필요하기 때문에 암호화가 필요하다.
  • DB 패스워드를 암호화하는 코드 샘플은 아래 URL에서 확인 가능하다.
    아래의 방법으로 DB패스워드를 암호화 하는 경우 암호화 class에서 tomcat-jdbc.jar를 읽어오기 때문에
    DataSource의 설정은 tomcat-jdbc의 설정을 따라야 한다.
  • http://www.jdev.it/encrypting-passwords-in-tomcat/
 

Encrypting passwords in Tomcat – JDev

Apache Tomcat is by far the most popular (open source) web server and Java servlet container. It has been around for a long time and – at the time of writing this post – has reached version 7.0.29. As Apache rightfully claims on its web site, Tomcat p

www.jdev.it

  • 그 외에도org.apache.commons.codec.binary.Hex를 사용하는 방법도 있으며 tomcat-dbcp.jar파일 사용을 원할경우
    이 방법을 사용해도 된다.
  • 패스워드 암호화에 필요한 jar파일 생성이 완료되었다면 해당 jar파일을 $CATALINA_HOME/lib 에 넣고 server.xml설정을 한다.
  • server.xml
<Resource name="jdbc/maria" auth="Container" type="javax.sql.DataSource"
              username="test"
              password="암호화된 패스워드"
              factory="jar파일 내부에 EncryptedDatasourceFactory 지정"
              url="0.0.0.0"
              driverClassName="org.mariadb.jdbc.Driver"
              maxActive="50"
              maxIdle="50"
              minIdle="50"
              maxWait="5000"
              initialSize="50"
        />

 

 

3. validation 설정

  • 주기적으로 DB와의 connection의 정상여부 check를 위해 validation설정을 한다.
  • 주로 응답으로 1을 반환하는 dummy query를 많이 사용하며 DB의 종류에 따라 query는 달라진다.
    아래 예시는 mariadb기준으로 select 1 from dual 을 사용했다.
  • server.xml
  <Resource name="jdbc/maria" auth="Container" type="javax.sql.DataSource"
              username="test"
              password="암호화된 패스워드"
              factory="jar파일 내부에 EncryptedDatasourceFactory 지정"
              url="0.0.0.0"
              driverClassName="org.mariadb.jdbc.Driver"
              maxActive="50"
              maxIdle="50"
              minIdle="50"
              maxWait="5000"
              initialSize="50"
              validationQuery="select 1 from dual"
              validationQueryTimeout="5000"
              testOnBorrow="true"
              testWhileIdle="true"
              timeBetweenEvictionRunsMillis="60000"
              logValidationErrors="true"
        />
</Context>
설정값 default 설명
validationQuery   check에 사용할 query로 주로 1을 반환하는 dummy query를 많이 사용한다.
DB의 종류에 따라 query는 달라진다.
validationQueryTimeout -1(무한대기) validationQuery의 결과가 올때까지의 시간이다.
testOnBorrow false true일 경우 Connection을 사용시마다 유효성을 check한다.
testWhileIdle false idle한 Connection을 check할지 여부이다.
timeBetweenEvictionRunsMillis 설정의 시간을 따른다.
timeBetweenEvictionRunsMillis 5000(ms) Connection의 마지막 사용시간부터 설정된 시간사이엔 check를 하지 않는다.
logValidationErrors false Validation 실패에 대해 logging을 할지 여부를 결정한다.

 

반응형

 

4. 기타 고려 사항

  • 위에서 언급했듯이 Tomcat이 DB와 연동하는데는 tomcat-dbcp.jar를 사용하는 방법과 tomcat-jdbc.jar를 사용하는 방법이 있다. 각각의 option값들이 다르기 때문에 어떻게 설정하느냐에 따라 option값들을 확인해야 한다.
  • tomcat-jdbc는 버그인지는 모르겠으나 DBConnection의 수가 min값 아래로 내려가도 min값만큼 shrink되지 않는다.
    (tomcat-dbcp를 사용하는 경우 validation이 성공하면 다시 shrink됨)
  • DataSource를 설정하는 방법은 다양하며 어디에 설정하느냐에 따라 DataSource가 생성되는 대상이 달라진다.
    아래 두가지 방법이 존재하며 개인적으로는 1)번의 방법이 바람직하다 생각한다.
    1) <GlobalNamingResources> 태그 내부에 설정할 경우 엔진 기준으로 생성되며 ResourceLink를 설정한
        Context에 서 해당 ConnectionPool을 공유하여 사용한다.
    2) <Context>태그 내부 또는 context.xml을 통해 설정할 경우 Context별로 ConnectionPool이 생성된다.

자원의 효율적 사용과 Application 개발의 편의를 위한 WAS DBPool 사용은 최근 H/W spec의 고성장과 다양한 libaray들의 제공, Container향 인프라 구축등의 영향으로 그 사용빈도가 줄어들고 있다.

그럼에도 안정적인 Connection확보나 장애 트러블슈팅등의 경우를 봤을 땐 아직 장점은 충분한 것 같다.

반응형