The last packet successfully received from the server was xxx,xxx milliseconds ago.

    오라클이나 Mssql을 주로 개발하던 개발자가 Mysql에서 개발을 할 경우, 당황하게 만드는 것이 있는데 바로 커넥션 풀에 관련된 문제이다. Mysql은 풀을 생성하고, 일정 시간동안 특정 커넥션풀을 사용하지 않을 경우 연결을 시도할 경우 DB에서 에러를 뱉어버리고 끊어버린다.




    에러 로그


    Your login attempt was not successful, try again. Reason: org.hibernate.exception.JDBCConnectionException: The last packet successfully received from the server was xxx,xxx milliseconds ago. The last packet sent successfully to the server was xxx,xxx 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.



    로그에 적혀 있는 것을 보면 알다시피 "autoReconnect=true"라는 문구가 있다. 즉, 위 문구를 url에 추가하면 자동적으로 reconnect를 시도하며, 에러를 방지한다. 위 문구는 mysql에서 사용할 때, 그냥 default 설정이라고 생각해도 무방하다. 서비스에 사용자가 무지 많아서, 24시간동안 서비스가 계속 꾸준히 지속된다면 나타나지는 않는다



    해결방안


    [AS-IS]

    jdbc:mysql://xxx.xx.xx.xxx:3306/test


    URL 설정이 위와 같다면, 아래로 회피 문구를 추가한다


    [TO-BE]

    jdbc:mysql://xxx.xx.xx.xxx:3306/test?autoReconnect=true



    위와 같은 방법으로도 해결이 안되는 경우가 있는데 그럴 땐, testwhileidle, timeBetweenEvictionRunsMillis  설정등으로 강제로 풀을 주기적으로 사용하게 만드는 설정이 있다.



    참고경로


    반응형

    댓글

    Designed by JB FACTORY