본문 바로가기
IT이야기

[Tomcat] DBCP 설정 이후 서비스 중단 문제

by 너머스고(numusgo) 2024. 2. 5.

 

톰켓(TOMCAT)에 JNDI를 사용하면 좋겠지만 대부분 개발의 편의를??? 아님 편해서 DBCP를 사용하여 

 

WAS ↔ DB 연결 구성을 한다.

 

개발할 때는 몇 명 사용 안 해서 문제는 없지만.... 개발 이후  며칠간 접속 자수도 별로 없는데 서비스가 안 되는 현상이 나오기 시작했다. WAS(tomcat)를 재시작하면 정상적으로 페이지가 보였지만... 문제를 찾을 때까지는 무한 삽질을 하였다.

 

당장 서비스 오픈 하는 날까지도.... 문제 해결이 안 되어 저녁까지 못 찾아  고생했던 기억이 있어요.

 

역시 절 실하면 되는 것이 였는가? DBCP옵션을 손보니 해결이 되었다.

 

그리고  Tomcat 기반의 JBOSS에서는 동일한 현상이 안 일어난다. 주의!! 그나마 커스터마이징 되어있다.

 

아래 예제는 기본 설정이다.

사용자 정보 넣고 밸리데이션 체크가 끝이다.  

 

       <!-- Oracle -->
        <bean id="dataSource-oracle" class="org.apache.commons.dbcp.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}"/>
                <property name="validationQuery" value="select 1 from dual" />
                <property name="testWhileIdle" value="true" />
                <property name="timeBetweenEvictionRunsMillis" value="60000" />
        </bean>

 

이번 설정은 최적한한 설정이다.

 

		<bean id="dataSource-oracle" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
                <property name="driverClassName" value="${Globals.DriverClassName}"/>
                <property name="url" value="${Globals.Url}" />
                <property name="username" value="${Globals.UserName}"/>
				<property name="initialSize" value="5"/>
                <property name="maxActive" value="30"/>
                <property name="maxIdle" value="5"/>
                <property name="maxWait" value="30000"/>
                <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" />
                <property name="poolPreparedStatements" value="true"/>
		</bean>

 

 

 

두 번째로 DBCP 1 버전과 DBCP 2 버전 차이가 있는데 DBCP1 버전 옵션을 사용하여 WAS 로그에는 사용되지 않는 옵션이라고 나오지만 잘 안 보니 모르는 사람이 많습니다.

 

버전별 파라미터 명을 구분하여 사용해야한다.

maxActice(1.x), maxTotal(2.x)

maxWait(1.x), maxWaitMillis(2.x)

 


 

아래는 최적화한 파라미터 예시

<Resource auth="Container" 
driverClassName="com.tmax.tibero.jdbc.TbDriver" 
maxTotal="20" maxIdle="10"  maxWaitMillis="5000"  
name="jdbc/testdb" 
username="test" password="test123" 
type="javax.sql.DataSource" 
url="jdbc:tibero:thin:@192.168.0.50:8629:testdb" />

 

<property name="maxTotal" value="50" />
<property name="maxIdle" value="50" />
<property name="maxWaitMillis" value="5000" />

maxWaitMillis="5000" 5초, or 3초로 한다.

 

그리고 dbcp 1버전에서는 아래 옵션 주어 해결

cachingAllowed="true" cacheMaxSize="100000"

 

/.../WEB-INF/applicationContext.xml   
파일의  bean id="dataSource" 이며 아래 옵션 적용 후, 문제가 발생안함

p:removeAbandoned="true"
p:removeAbandonedTimeout="10000"
p:logAbandoned="true"
p:timeBetweenEvictionRunsMillis="300000"

 

 


 

 

 

아파치 공식 Site

 

https://commons.apache.org/proper/commons-dbcp/configuration.html

 

DBCP – BasicDataSource Configuration

BasicDataSource Configuration Parameters Parameter Description username The connection user name to be passed to our JDBC driver to establish a connection. password The connection password to be passed to our JDBC driver to establish a connection. url The

commons.apache.org

 

* 여기도 설명 기본 설명은 잘되어있어요

https://zzang9ha.tistory.com/376

 

DBCP(DataBase Conncetion Pool), 커넥션풀 이란?

📎 DBCP(DataBase Connection Pool) 안녕하세요, 이번에 정리할 내용은 DBCP(데이터베이스 커넥션 풀) 입니다. 클라이언트와 서버 사이드인 웹 어플리케이션에서, 사용자의 요청에 따라 Connection이 생성된

zzang9ha.tistory.com

 

* 네이버 DBCP 설명 잘되어 있어요. 자세한 설명은 여기로~~

https://d2.naver.com/helloworld/5102792