반응형
이번 포스팅에서는 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>
- DataSource설정 옵션값은 아래 URL에서 확인 가능하다.
- https://tomcat.apache.org/tomcat-8.5-doc/jdbc-pool.html
- 추가로 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/
- 그 외에도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"
minEvictableIdleTimeMillis="-1"
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) | Eviction thread의 활동주기 |
minEvictableIdleTimeMillis | 60000(ms) | Idle한 상태로 유지가능한 시간. 설정된 시간 이상 Idle상태를 유지하는 Connection을 정리한다.(-1로 설정할 경우 동작하지 않음) |
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확보나 장애 트러블슈팅등의 경우를 봤을 땐 아직 장점은 충분한 것 같다.
반응형
'미들웨어 > Apache,Tomcat' 카테고리의 다른 글
Tomcat Connector Threads 설정 정리 (0) | 2023.03.08 |
---|---|
Tomcat Session Clustering 설정 (0) | 2023.03.05 |
Tomcat 설치 및 기본구조 (0) | 2023.03.03 |
Apache mod_security를 사용한 보안강화 (0) | 2023.03.02 |
Apache mod_jk timeout 정리 (0) | 2023.02.28 |