2014-08-31 1 views
3

Spring Framework 3.2에서 최대 절전 모드 4를 사용 중입니다. 로컬 서버에서 긴 유휴 시간이 지난 후에 요청을 보낼 때 위 예외가 발생합니다 (apache-tomcat v7.0) 데이터베이스가 원격 서버에 있습니다. 수 시간의 검색 후 문제는 연결 풀에서 발생한다는 사실을 알게되었습니다. 연결 풀 수를 시도했지만 만족스러운 해결책을 찾지 못했습니다. 벨로우즈는 내 스프링 데이터 파일의 현재 데이터 소스입니다.java.sql.SQLException : 연결 캐시에 올바르지 않거나 오래된 연결이 있음

<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" 
destroy-method="close"> 
<property name="connectionCachingEnabled" value="true" /> 
<property name="URL" value="${app.jdbc.url}" /> 
<property name="user" value="${app.jdbc.username}" /> 
<property name="password" value="${app.jdbc.password}" /> 
<property name="connectionCacheProperties"> 
<value> 
MinLimit:70 
MaxLimit:200 
InitialLimit:20 
ConnectionWaitTimeout:120 
InactivityTimeout:180 
ValidateConnection:true 
</value> 
</property> 
</bean> 

을 알려주십시오.

+0

연결 핸들을 재사용 하시겠습니까? 신선한 연결 처리를 시도하십시오 – lalit

+0

연결 핸들이 무엇입니까? 그리고 그것은 자바와 함께 사용됩니까? 참고 : ODBC를 사용하지 않고 ODBC를 사용하고 있습니다. –

답변

6

데이터베이스에 더 이상 연결되어 있지 않은 연결 풀에 연결되어 있으면 "유효하지 않거나 오래된 연결"오류가 발생합니다. 다음은이 상황을 초래할 수있는 몇 가지 시나리오입니다.

  1. dba를 통해 연결이 수동으로 데이터베이스에서 중단되었습니다. 예를 들어, 경우 연결이 "ALTER SYSTEM KILL SESSION"
  2. 연결이 오랫동안 사용하지 않고 연결 풀에 존재하고 데이터베이스 (IDLE_TIME)에 의해 시행 시간 초과로 인해 분리하여 죽었다
  3. 재시작
  4. 네트워크 이벤트가 드롭 연결 발생했습니다 데이터베이스는, 아마도 네트워크를 사용할 되기 때문에 또는 방화벽이 너무 오래 열려있는 연결을 떨어졌다.

당신이 InactivityTimeout을 설정하는 경우, 당신은 그것이 IDLE_TIME가 데이터베이스에 의해 수행되는 적은이다 있는지 확인해야합니다. 당신은 당신이 connectionCacheProperties를 사용할 때 항상 아래 쿼리

select * from dba_profiles dp, dba_users du 
where dp.profile = du.profile and du.username ='YOUR_JDBC_USER_NAME'; 

으로 IDLE_TIME를 얻을 당신은 시간 제한보다 뭔가에 PropertyCheckInterval 속성을 설정해야 할 수 있습니다. 기본값은 900 초입니다. 이는 캐시 데몬 스레드가 매 15 분마다 만 실행되고 시간 제한을 적용 함을 의미합니다. 따라서 항상 이것을 타임 아웃 속성보다 낮은 값으로 설정하려고합니다.

저는 항상 MinLimit으로 0을 사용합니다. 당신이 설정 파일을 다시 쓰기

조금 그것을 만들 것입니다 : 당신이 오래된 유효성을 검사 할 때

<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close"> 
<property name="connectionCachingEnabled" value="true" /> 
<property name="URL" value="${app.jdbc.url}" /> 
<property name="user" value="${app.jdbc.username}" /> 
<property name="password" value="${app.jdbc.password}" /> 
<property name="connectionCacheProperties"> 
    <props merge="default"> 
    <prop key="MinLimit">0</prop> 
    <prop key="MaxLimit">200</prop> 
    <prop key="InitialLimit">1</prop> 
    <prop key="ConnectionWaitTimeout">120</prop> 
    <prop key="InactivityTimeout">180</prop> 
    <prop key="ValidateConnection">true</prop> 
    <prop key="PropertyCheckInterval">150</prop> 
    </props> 
    </property> 
</bean> 

당신은 또한 당신의 네트워크가 실제로 시간에 파괴되는 "잘못된 또는 부실 연결 오류"를 얻을 수 있습니다 수영장에서 얻은 연결.

2

connectionCachingEnabled이 핵심입니다. 이 값을 true로 설정하면 연결을 캐시하는 암시 적 연결 캐시 (독점적 인 Oracle 연결 풀링의 일종)를 사용하고 있습니다. ValidateConnection으로 연결이 유효해야합니다. 다른 연결 풀을 시도했다고 언급하셨습니다. 거의 모든 연결 풀 (예 : commons dbcp, c3p0, tomcat dbcp)은 응용 프로그램에 전달하기 전에 연결을 확인하는이 기능을 제공합니다. 예를 들어 Tomcat DBCPtestOnBorrow이고 validationIntervalvalidationQuery과 함께 있습니다. 다른 풀에도 비슷한 속성이 있습니다. 다른 수영장들도 같은 문제를 겪고 있습니까?

+0

감사합니다. connectionCachingEnabled 속성을 제거하고 해당 문제를 피하십시오. –

+0

도움이 되셨습니다. 대답을 "수락 됨"으로 표시하십시오 – Shailendra

+0

또한 연결이 캐시되지 않으므로 성능에 미치는 영향을 검토하십시오. 이를 위해 풀 접속 풀을 고려해보십시오. – Shailendra

0

네, 오라클의 UCP로 전환 한 후 오류

java.sql.SQLException: Invalid or Stale Connection found in the Connection Cache. 

를 보았다, 나는 이후 모든 부실 연결을 보지 못했다. 나는 다음과 같이 설정했다.

<New id="DS" class="org.eclipse.jetty.plus.jndi.Resource"> 
    <Arg></Arg> 
    <Arg>OracleDS</Arg> 
    <Arg> 

    <New class="oracle.ucp.jdbc.PoolDataSourceImpl"> 
        <Set name="URL">jdbc:oracle:thin:@abc.corp.com:1234:xyz</Set> 
        <Set name="user">owner</Set> 
        <Set name="password”>pwd</Set> 
        <Set name="connectionFactoryClassName">oracle.jdbc.pool.OracleDataSource</Set> 
        <Set name="minPoolSize">0</Set> 
        <Set name="maxPoolSize">10</Set> 
        <Set name="inactiveConnectionTimeout">300</Set> 
        <Set name="maxStatements">200</Set> 
        <Set name="maxConnectionReuseCount">150</Set> 
        <Set name="connectionWaitTimeout">9</Set> 
        <Set name="abandonedConnectionTimeout">30</Set> 
        <Set name="validateConnectionOnBorrow">true</Set> 
        <Set name="SQLForValidateConnection">SELECT SYSDATE FROM DUAL</Set> 
    </New> 

    </Arg> 
</New>