2013-08-05 2 views
0

최대 절전 모드를 사용하여 이상한 동작이 발생합니다. 나는 MySQL 데이터베이스로 작업하면서 최대 절전 모드와 스프링을 사용하는 자바 웹 애플리케이션을 가지고있다.최대 절전 모드 풀이 연결을 해제하는 것 같습니다.

증상 :

show processlist; 

내가 내 데이터 소스 구성에 정의 된 연결의 양을 볼 수 있지만 시간이 경과 할 때 자신의 ID 나를 생각하고, 변화 : 은 useing으로 내 SQL에 연결된 세션 확인 연결이 닫히고 다시 연결됩니다. 트래픽이없는 경우에도이 문제가 발생합니다.
풀링 된 연결이 데이터베이스에서 ID를 유지할 것으로 예상됩니다.

구성 :

<bean id="DataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="${url}" /> 
    <property name="username" value="${username}" /> 
    <property name="password" value="${password}" /> 
    <property name="maxWait" value="10" /> 
    <property name="maxIdle" value="5" /> 
    <property name="maxActive" value="0" /> 
    <property name="validationQuery" value="SELECT 1"/> 
    <property name="testOnBorrow" value="true" /> 
    <property name="testOnReturn" value="true"/> 
    <property name="testWhileIdle" value="true"/> 
    <property name="timeBetweenEvictionRunsMillis" value="10000"/> 
    <property name="minEvictableIdleTimeMillis" value="60000"/>  
</bean> 
<bean id="SessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="DataSource"></property> 
    <property name="mappingResources"> 
     <list> 
      <value> 
       data/entities/entity.hbm.xml 
      </value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect"> 
       org.hibernate.dialect.MySQLDialect 
      </prop> 
     </props> 
    </property> 
</bean> 

<bean id="entityDaoImpl" class="data.dao.EntityDaoImpl"> 
    <property name="sessionFactory" ref="SessionFactory" /> 
</bean> 

<bean id="SessionFactory2" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="DataSource"></property> 
    <property name="mappingResources"> 
     <list> 
      <value> 
       data/entities/entity2.hbm.xml 
      </value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect"> 
       org.hibernate.dialect.MySQLDialect 
      </prop> 
     </props> 
    </property> 
</bean> 

<bean id="entity2DaoImpl" class="data.dao.Entity2DaoImpl"> 
    <property name="sessionFactory" ref="SessionFactory2" /> 
</bean> 

내 생각 엔 그것이 2 개 개의 다른 세션 공장이 동일한 데이터 소스를 사용하고 있다는 사실에 연결 될 수 있다는 것입니다,하지만 난 어떤 깊은 이해를 그리워 (또는되고 오른쪽으로 보라 왜 또는 완전히 틀린 지 모르겠다.)

나는 스프링 2.5를 사용하고, 바람둥이 6에서 실행되는 Hibernate 3.1.1을 추가 할 것이다. 나는 많은 장소에서 사람들이 hibernateTemplate의 사용을 낙담 시키지만 코드는 사용 중이다. 그것.

편집 :

130806 10:58:43  13 Connect  [email protected] on database 
130806 10:58:43  13 Query  SET NAMES hebrew 
130806 10:58:43  13 Query  SET character_set_results = NULL 
130806 10:58:43  13 Query  SHOW VARIABLES 
130806 10:58:43  13 Query  SHOW COLLATION 
130806 10:58:43  13 Query  SET autocommit=1 
130806 10:58:43  13 Query  SET sql_mode='STRICT_TRANS_TABLES' 
130806 10:58:43  13 Query  SELECT 1 
130806 10:58:43  13 Query  SET autocommit=1 
130806 10:58:54  13 Query  SET autocommit=1 
130806 10:58:54  13 Query  SELECT 1 
130806 10:58:54  13 Query  SET autocommit=1 
130806 10:59:25  13 Query  SET autocommit=1 
130806 10:59:25  13 Query  SELECT 1 
130806 10:59:25  13 Query  SET autocommit=1 
130806 11:00:27  13 Quit 

그리고에 관해서을 : 나는 시도하고 연결이 무엇을하고 있는지 파악하도록 감사를 열고 난 그 자체에 의해 폐쇄되었다 보았다 하나에 초점을 맞추고

내 이해가 이것은 Quit 명령을 가지고 있기 때문에 문제가 DB 측에 없다는 것을 보여준다. 데이터 원본 구성에 누락 된 일부 keepAlive 구성이 있습니까?

감사

답변

0

나는이 문제의 원인을 발견했다. 루트는 minEvictableIdleTimeMillis 매개 변수입니다.

이 매개 변수 문서는 말한다 : 그것은 유휴 객체 축출 기 (있는 경우)에 의해 퇴거 eligable 전에

최소 시간은 물체가 풀에서 유휴 수 있습니다.

내 경우에는 유휴 상태 일 때 60 초 후에 연결이 끊어 질 수 있습니다.

매개 변수 timeBetweenEvictionRunsMillis 문서는 말한다 : 밀리 초

수는 유휴 객체 축출 기 스레드의 실행 사이에 잠을.0이 아닌 경우 유휴 오브젝트 축출 기 스레드는 실행되지 않습니다.

제 경우에는 퇴거 확인이 10 초마다 발생합니다. 내 구성에서 누락 다른 매개 변수는 문서화 numTestsPerEvictionRun되어 객체의 수는 유휴 객체 축출 기가 스레드 (있는 경우)의 각 실행 중에 검사

.

제 경우에는 3 개의 연결 (기본값)이 제거되었는지 확인됩니다.

모든 10 초마다 (첫 번째 분 응용 프로그램이로드되는 경우 제외) 내 10 연결 중 3 개가 축출됩니다. (testWhileIdle이 true 인 경우) 유휴 상태에서 validationQuery를 사용하여 테스트 한 경우에도 마찬가지입니다.

나는 validationQuery 쿼리 검사가 유휴 시간 계산을 재설정 할 것이라고 생각했습니다 (연결을 통해 쿼리가 전송되기 때문에). 하지만 나는 틀 렸습니다.

마지막으로 해결책은 minEvictableIdleTimeMillis를 60000 대신 600000으로 설정하여 유휴 연결을 오래 유지하도록하는 것이 었습니다.

1

의 MySQL은 wait_timeout 후 유휴 연결을 죽인다. 연결 풀이 종료되었음을 감지하고 다시 연결합니다. 모든 좋은

은 ...

+0

그래서 내 응용 프로그램에 영향을 미치지 않습니까? wait_timeout은 mysql 구성입니까? 하나의 데이터 소스에 대해 여러 세션 팩토리가있는 데 문제가 있습니까? –

+0

MySQL에서는 정상적인 동작입니다. 네,'wait_timeout'은'my.cnf'에서 설정됩니다. –

+0

나는 my.cnf를 확인하고 wait_timeout의 기본값을 사용하고있는 것을 보았다. 이것은 28800 초이며, ID의 변경 사항을 초 만에 볼 수 있습니다. 따라서이 문제는 문제가되는 것 같습니다. –