一止长渊

项目部署查看日志信息

N 人看过
字数:483字 | 预计阅读时长:2分钟

在 o2o 项目部署到远程服务器时,发现出现报错,这时候如何及时发现错误呢?登陆远程服务器,查看 tomcat 的日志信息
截屏2021-02-09 11.17.13.png

可以看到如下日志信息:

Caused by: com.mysql.cj.exceptions.CJCommunicationsException: The last packet successfully received from the server was 32,945,617 milliseconds ago. The last packet sent successfully to the server was 32,945,626 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.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
        at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167)
        at com.mysql.cj.protocol.a.NativeProtocol.readMessage(NativeProtocol.java:546)
        at com.mysql.cj.protocol.a.NativeProtocol.checkErrorMessage(NativeProtocol.java:710)
        at com.mysql.cj.protocol.a.NativeProtocol.sendCommand(NativeProtocol.java:649)
        at com.mysql.cj.protocol.a.NativeProtocol.sendQueryPacket(NativeProtocol.java:948)
        at com.mysql.cj.NativeSession.execSQL(NativeSession.java:1075)
        at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:930)
        ... 84 common frames omitted

解决:原因在于 Mysql 客户端中 wait_timeout 是 28800 秒(8 个小时),如果项目在 8 个小时都没有访问数据库,那么连接池的连接就会自动的失效,等项目访问时,使用数据库连接时因为连接已经失效,所以就会报错超时的信息
截屏2021-02-09 11.21.19.png
解决办法 1:延长 mysql 的 wait_timeout 值(不推荐)
解决办法 2:在数据库连接池中配置定期使用数据库连接,在小于 8 个小时的连接就访问一次数据库

<!--解决办法:定期18000秒(5个小时)使用连接,使得连接不会因为timeout被Mysql断开-->
<property name="preferredTestQuery" value="SELECT 1"/>
<property name="idleConnectionTestPeriod" value="18000"/>
<property name="testConnectionOnCheckout" value="true"/>

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。