2013-02-13 2 views
3

는 지금 약간의 시간에 대한 웹 주위를 찾고있다 그리고 나는이 문제를 해결하기 위해 아직했습니다 :봄 연결 풀링 구성

을 나는 다음과 같은 데이터 소스 구성이 있습니다

<bean id="cpms.prod.ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property> 
    <property name="url"><value>jdbc:mysql://localhost/mysql</value></property> 
    <property name="username"><value>test</value></property> 
    <property name="password"><value>test</value></property> 
    <property name="initialSize" value="1" /> 
    <property name="maxActive" value="2" /> 
    <property name="maxIdle" value="1"></property> 
</bean> 

것은이되어야한다 한 지점에 활성 연결이 2 개 뿐이고 풀에 사용되는 연결이 있는지 확인하기에 충분합니다.

내 Java 코드에서 세 개의 쿼리를 수행하는 데 SimpleJdbcTemplate을 사용하고 있으며이 개체가 각 쿼리가 끝난 후에도이 개체가 풀에 연결을 반환해야한다는 것을 알고 있기 때문에 세 번째 쿼리를 차단해야합니다. 종료.

데이터베이스 관리 콘솔에서 3 개의 연결이 표시되면 절전 상태로 변경됩니다. 쿼리를 다시 실행하면 다른 3 연결 팝업이 표시되고 다른 3 연결이 계속 표시됩니다.

내가 폐쇄 할 수있는 연결을 찾은 유일한 방법은 설정입니다 : 실행하고 기존의 연결을 청소 버려진 연결 절차를 강제로

<property name="removeAbandoned" value="true"/> 
<property name="removeAbandonedTimeout" value="1"/> 

<property name="minIdle" value="0"></property> 
<property name="timeBetweenEvictionRunsMillis" value="1000"></property> 
<property name="minEvictableIdleTimeMillis" value="1000"></property> 

.

이러한 매개 변수에 간섭 할 필요가 없으며 성능 문제가있을 수 있으므로 특히 낮게 설정하지 않아야합니다.

또한 timeBetweenEvictionRunsMillisminEvictableIdleTimeMillis을 낮은 값으로 변경할 때까지 here으로 표시된 해결 방법을 시도해 보았습니다. 그리고 여전히 연결을 2로 제한하지 않습니다.

+0

명확한 정상 확인 - JDBCTemplate이 실제로 'cpms.prod.ds'를 데이터 소스로 사용하고 있습니까? 맞습니까? – AngerClown

+0

예, 사용 가능한 유일한 데이터 소스입니다 –

+0

어떤 버전의 apache-common-dbcp가 사용합니까? 초기 버전에서 minIdle 0에 문제가있었습니다. https://issues.apache.org/jira/browse/DBCP-379 –

답변

0

JdbcTemplate의 모든 연결은 DataSourceUtils.doGetConnection입니다. 당신은 API에서 BasicDataSource

에서 '정보'로 인해 수 있습니다보고 있습니다 :

Abandonded connections are identified and removed when getConnection() is invoked and the following conditions hold :

  • getRemoveAbandoned() = true
  • getNumActive()> getMaxActive() - 3
  • getNumIdle() < 2

데이터 소스가 지정된 최대 활성보다 3 개의 활성 연결을 허용하는 것으로 보입니다.