2

나는 덮개 아래에 Tomcat 6.0.37 및 MySQL 5.5를 사용하여 트래픽이 많은 사이트에서 발생하는 문제를 파악하려고합니다. 테스트로드는 Tomcat에 대한 200 개의 동시 연결이었습니다. 동일한 URL에 대한 모든 연결과 모두 데이터베이스에 연결되었습니다.Apache Commons DBCP 이상한 동작

연결 풀링을 수행하기 위해 포함 된 tomcat-dbcp 패키지를 사용하고 있습니다.

<Resource name="jdbc/appDataSource" auth="Container" 
      type="javax.sql.DataSource" 
      driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost/myapp?autoReconnect=true&amp;characterEncoding=UTF-8" 
      username="root" 
      password="*****" 

      testOnBorrow="true" 
      maxWait="5000" 
      maxIdle="1" 
      maxActive="30" 
      validationQuery="SELECT 1" 
      validationInterval="30000" 
      timeBetweenEvictionRunsMillis="30000" 

      logAbandoned="true" 
      removeAbandoned="true" 
      removeAbandonedTimeout="60" 
    /> 

내가 연결 풀 꽤 광범위하게 연결을 잃어 버릴 것을 볼 해당 사이트에 몇 가지 테스트 트래픽을 실행하면 : 여기에 우리가 사용하는 자원 구성입니다. 약 1 분 후에 MySQL에 대한 연결 시도 횟수가 10000 회를 초과했으며 풀에는 20 개 이상의 연결이 없었습니다. 모든 연결이 거의 즉시 닫혔습니다.

내 구성에서 속성

  factory="org.apache.commons.dbcp.BasicDataSourceFactory" 

을 lib 폴더에 추가하고 포함하여 아파치 코 몬즈로 전환하려했지만 그것은 나에게 동일한 결과를했다.

나는 사실 아주 좋은 일을하는 C3P0와 BoneCP로 전환 시도하고 나는 30 개 연결의 최대가 개최되는 본 - 새로운 또는 떨어 연결 나는 또한 아파치에서 연결 풀을 사용하려고했습니다

MySQL을

에 (단지 그것의 이익을 위해) 톰캣 7은 또한 다음과 같은 구성으로 아주 능숙하게 일 :

<Resource name="jdbc/appDataSource" auth="Container" 
      type="javax.sql.DataSource" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost/myapp?autoReconnect=true&amp;characterEncoding=UTF-8" 
      username="root" 
      password="******" 

      maxIdle="1" 
      maxActive="30" 
      validationQuery="SELECT 1" 
      validationInterval="30000" 
      timeBetweenEvictionRunsMillis="30000" 

      logAbandoned="true" 
      removeAbandoned="true" 
      removeAbandonedTimeout="60" 
    /> 

는 간단한 경우에도 작동하지 않습니다 아파치 코 몬즈 DBCP 정말 뭔가 잘못이 있는지 궁금하다 ? 이 모든 것에 대한 설명이 있습니까?

+0

당신은 해결책을 찾았습니까? 나는 같은 문제가있다. – Jens

답변

0

DBCP는 부하가 많은 시스템 (멀티 스레딩) 인 DBCP는 최신 제품이 아니며 DBCP보다 C3P0을 사용하는 것이 좋습니다.

C3P0은 jdbc3 스펙 및 jdbc2에 대한 선택적 확장으로 정의 된 기능을 사용하여 기존 JDBC 드라이버를 "엔터프라이즈 용이"하게 만들기위한 사용하기 쉬운 라이브러리입니다.

Tomcat 7에는 새로운 연결 풀이 추가 된 것으로 보입니다. 이것은 commons-dbcp 연결 풀을 대체합니다. commons-dbcp 연결 풀은 소규모 또는 소통량이 적은 응용 프로그램에서 잘 작동하지만 고도의 동시 환경 (멀티 코어/멀티 CPU)으로 인해 문제가있는 것으로 알려져 있습니다.

DBCP 대 C3P0에 대한 자세한 내용은 Connection pooling options with JDBC: DBCP vs C3P0을 참조하십시오.

0

문제의 원인은 최대 maxIdle 설정입니다. maxIdle을 1로 설정하면 지정된 시간에 둘 이상의 연결이 풀에서 유휴 상태가 될 수 없습니다. 과중한 동시로드에서는 연결이 빌려 오는 것보다 빠른 속도로 반환되기 때문에 풀에 유휴 연결이 일시적으로 생성됩니다. maxIdle을 1로 설정하면 리턴시 첫 번째 유휴 연결을 제외한 모든 연결이 닫힙니다. maxIdle을 기본값 (1.x의 경우 8)으로 두거나 maxActive와 같게 설정하면 성능이 향상됩니다.

https://commons.apache.org/proper/commons-dbcp/api-1.4/org/apache/commons/dbcp/BasicDataSource.html#maxIdle을 참조하십시오.