spring을 사용하다보면 db pool이 끊키는 현상이 발생하고 한다.
그럴땐 context-datasource.xml에 db pool을 만들어주는 자리에 option을 주면 해결이 가능하다.
[첫번째 방법은 db pool size를 늘리는 것이다.]
<!-- postgresql -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${Globals.DriverClassName}"/>
<property name="url" value="${Globals.Url}" />
<property name="username" value="${Globals.UserName}"/>
<property name="password" value="${Globals.Password}"/>
<!-- 운영환경에서 동시접속이 많은경우 connection wait 발생 -->
<!-- 운영에만 적용 : 개발에서 100개씩 생성하면 pool 이 넘친다. -->
<property name="initialSize" value="100"/>
<property name="maxActive" value="1000"/>
<property name="maxIdle" value="100"/>
<property name="minIdle" value="100"/>
<property name="maxWait" value="2000"/>
<bean>
bean을 생성하는 자리에 initialSize, maxActive, maxIdle, minIdle, maxWait 설정을 주면 된다.
설명 :
<!-- 운영환경에서 동시접속이 많은경우 connection wait 발생 -->
<!-- 운영에만 적용 : 개발에서 100개씩 생성하면 pool 이 넘친다. -->
[두번쨰 방법은 db에 의미없는 sql을 주기적으로 실행시켜 주는 것이다.]
<!-- postgresql -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${Globals.DriverClassName}"/>
<property name="url" value="${Globals.Url}" />
<property name="username" value="${Globals.UserName}"/>
<property name="password" value="${Globals.Password}"/>
<!-- 1분 -->
<property name="validationQuery" value="select 1" />
<property name="testWhileIdle" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="60000" />
</bean>
validationQuery, testWhileIdle, timeBetweenEvictionRunsMillis 옵션이다.
1분에 한번씩 select 1 query를 실행시켜주는것이다.
oracle일경우 select 1 from dual을 실행시켜주어도 된다.