복붙노트

[SPRING] 연결 풀 문제

SPRING

연결 풀 문제

얼마 동안 유휴 상태였던 후에 응용 프로그램을 시작하면 아래 오류가 발생합니다. (나는 Spring + Hibernate + MySQL을 DB로 사용하고있다)

ERROR [org.hibernate.util.JDBCExceptionReporter]The last packet successfully received from the server was 74,188,684 milliseconds ago. 
The last packet sent successfully to the server was 74,188,685 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
org.hibernate.exception.JDBCConnectionException: could not execute query

내 servlet-context.xml에 아래를 추가하여이 문제를 해결했습니다.

<beans:property name="validationQuery" value="SELECT 1"/>

저는이 문제에 대해 솔루션에보다 구체적으로 질문했습니다. 왜 그 오류가 발생했는지 알 필요가 있습니다.

위의 링크에서 제공되는 첫 번째 (autoReconnect = true로 연결 문자열 구성) 및 세 번째 옵션 (연결 유효성을 테스트하기 위해 연결 풀 구성)을 시도했지만 둘 다 작동했습니다. 아직도 내가 왜 오류를 얻는 지 알지 못한다.

다음은 업데이트 된 servlet-context.xml 파일이며 연결 풀링에 ApacheDBCP를 사용하고 있습니다.

<beans:bean id="MyID" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <beans:property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <beans:property name="url" value="jdbc:mysql://localhost:17761/myDB"/>
        <beans:property name="username" value="myname"/>
        <beans:property name="password" value="mypwd"/>
        <beans:property name="maxIdle" value="5"/>
        <beans:property name="maxActive" value="20"/>
        <beans:property name="minIdle" value="5"/>
        <beans:property name="validationQuery" value="SELECT 1"/>
</beans:bean>

연결 만료 문제입니까? 제발 도와주세요.

해결법

  1. ==============================

    1.다음은 사건의 흐름을 보여줍니다.

    다음은 사건의 흐름을 보여줍니다.

    autoReconnect = true가 작동하고 연결의 유효성을 테스트하는 풀이 작동하는 이유는 호출 시스템에이 상황에 대한 연결을 테스트하고 이러한 상황이 발생하면 다시 시도하도록 지시하기 때문입니다.

    유효성 검사 쿼리가 성능에 영향을 미칠지 여부 : 이론적으로 연결을 사용하여 무언가를 수행합니다. 실제로 어떤 것은 매우 사소한 것이므로 전체 시스템의 맥락에서 그 영향을 무시할 수 있습니다.

    [편집하다]

    이 경우 아파치 DBCP는 연결 풀에 매달려 있지만 DBCP가 모든 호출 후에 연결을 닫는 것을 원하지는 않습니다. 연결 풀의 요점은 연결을 생성하는 것이 값 비싸기 때문에 다음 호출을 위해 연결을 준비하는 것입니다. 풀에 의해 관리되는 연결 개체는 실제 데이터베이스 연결에 의해 백업되고 데이터베이스는 유휴 시간 초과 기간 후에 실제 연결을 닫는 개체입니다. 유휴 연결을 종료하기위한 제한 시간은 연결 풀이 아닌 데이터베이스에서 구성됩니다. 이 때문에 DBCP는 실제로 연결을 시도하지 않으면 연결이 닫혔는지 여부를 알 수 없습니다. 그것이 유효성 확인 쿼리가 필요한 이유입니다.

    DBCP 구성에 대한 자세한 정보는 구성 페이지 및 API 문서를 참조하십시오.

  2. from https://stackoverflow.com/questions/17046815/connection-pool-issue by cc-by-sa and MIT license