2012-12-06 3 views
15

DBCP에서 연결 누수 및 교착 상태가 발생하여 Tomcat JDBC-pool로 대체하기로 결정했습니다. 물론 마이그레이션은 정말 간단했습니다.DBCP를 Tomcat JDBC-pool으로 바꾸는 동안로드가 증가하고 성능이 저하됩니다. JDBC-pool

그러나 프로덕션 환경에서 배포 한 후에는 두 Tomcat이 실행되는 서버의로드가 4-4.5에서 5.5로 증가합니다. 우리는 수영장 변경을 제외하고는 더 이상 아무것도하지 않았습니다. 또한 JMeter로 측정 한 성능은 약 5 % 감소합니다.

풀 매개 변수를 조정하는 데 시간을 할애했지만 눈에 띄는 효과는 없었습니다.

<Resource name="jdbc/xxxxxx" 
      auth="Container" 
      type="javax.sql.DataSource" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      initialSize="10" 
      maxActive="100" 
      minIdle="10" 
      maxIdle="50" 
      maxWait="10000" 
      testOnBorrow="true" 
      testOnReturn="false" 
      testOnConnect="false" 
      testWhileIdle="false" 
      validationQuery="SELECT 1 from dual" 
      validationInterval="30000" 
      suspectTimeout="60" 
      timeBetweenEvictionRunsMillis="30000" 
      removeAbandonedTimeout="60" 
      removeAbandoned="true" 
      logAbandoned="true" 
      abandonWhenPercentageFull="50" 
      minEvictableIdleTimeMillis="60000" 
      jmxEnabled="true" 
      username="xxxxx" 
      password="xxxxx" 
      driverClassName="oracle.jdbc.OracleDriver" 
      url="jdbc:oracle:oci:xxxxx"/> 

FairQueue 및 PoolSweeperEnabled 봄의 ApplicationContext-jdbc.xml에서

해당 난 단지가 :

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="resourceRef"> 
     <value>true</value> 
    </property> 
    <property name="jndiName"> 
     <value>java:comp/env/jdbc/PortalDB</value> 
    </property> 
    </bean> 

어떻게 생각 나는 아래 (server.xml<GlobalNamingResources>에서) 나의 현재의 설정을 붙여 잘못하고있는거야? 나는 JDBC_pool이 DBCP보다 빠르다고 생각했다.

+0

testWhenIdle = "true"로 시도하고 maxActive 수를 100에서 20으로 최소화하려고 시도하십시오. 풀에 연결 수가 너무 많아서 작업 속도가 느려질 수 있습니다. –

+1

이전과 같은 유효성 검사 쿼리를 사용하고 있습니까? – rootkit

+0

@ rootkit007 - 아니요, dbcp로 개미 확인 쿼리를 사용하지 않았습니다. – Dzinek

답변

0

진단 정보가 이상합니다. AFAIK Tomcat의 DBCP lib는 commons-dbcp ...의 재 포장 된 버전이므로 한쪽에서 다른쪽으로 변경해도 작동이나 성능이 변경되어서는 안됩니다. (here 참조)

사용하는 버전이 변경되었을 수 있습니다. 특히 1.3/1.4 차이점에 유의하십시오. (here 참조)

어쨌든 구성은 괜찮은 것 같습니다 (실제로 발생할 수있는 문제에도 불구하고 실제로 작동 함). lib 디렉토리를 업데이트하는 것이 디버그 모드에 들어 가지 않으면 문제를 해결할 수있는 유일한 방법 일 것입니다 ...

"DBCP의 연결 누수 및 교착 상태 문제"에 대해 더 구체적으로 설명 할 수 있습니까? 교착 상태와 연결 풀 사이에 링크가 있는지를 결정하는 것은 매우 정확한 진단입니다. 어떻게 이런 식으로 왔습니까? SQL 문은 교착 상태가 발생하기 쉽기 때문에 교착 상태가 발생할 수 있지만 풀은 많은 연결을 동시에 제공함으로써 가능합니다. 실제로 이것은 단지 작업입니다.

+0

OP는 Tomcat의 리 패키징 된 dbcp와 다른 Tomcat jdbc-pool에 대해 이야기합니다. http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html – dnault

1

설정 및 조정이 정확합니다. 로드 증가는 서버가 동시에 더 많은 동시 요청을 처리 한 결과 일 수 있습니다. DBCP는 모든 스레드에서 풀을 잠근 방법 때문에 서버가이로드를 수행하지 못하게 할 수 있습니다. jdbc-pool은이 작업을 수행하지 않으므로 동시성이 향상되었습니다. 부하가 증가하면 응답 속도가 느려지지만 처리량이 증가합니다.

나는 동시성을 처리하기 위해 당신의 maxThreads에 맞게 조정

maxActive 

을 시작 했죠.