使用连接池druid报错The last packet successfully received from the server was XXX milliseconds ago.(实测解决)

出现场景

跑定时任务执行sql脚本的时候,sql的复杂度特别大,又不想优化,客户端跑需要10几秒,在druid连接池中跑任务就报上面的错误了。完整错误如下:

The last packet successfully received from the server was 10,009 milliseconds ago. The last packet sent successfully to the server was 10,009 milliseconds ago.

分析

引入chatgpt对此错误的分析如下:

  • 提问:使用druid查询mysql报错The last packet successfully received from the server was 10,011 milliseconds ago. The last packet sent successfully to the server was 10,011 milliseconds ago.
  • ChatGPT回答:
    这个错误信息通常表示MySQL连接已经超时了,即长时间没有收到新的查询请求。这可能是因为数据库连接处于空闲状态而被MySQL服务器关闭。你可以尝试使用以下方法来解决这个问题:
    
    检查数据库服务器和应用服务器之间的网络连接是否正常,特别是在高延迟或不稳定的网络环境下。
    
    增加数据库连接的超时时间,这可以通过在JDBC URL中添加"autoReconnect=true&autoReconnectForPools=true&connectTimeout=30000&socketTimeout=60000"参数实现(具体数值可以根据实际情况调整)。
    
    使用数据库连接池来管理连接,可以更好地控制连接的超时时间和重连逻辑。
    
    检查数据库是否已满,如果数据库已经使用了大量的系统资源,那么此时数据库的性能可能很低,以至于无法响应新的查询请求。
    
    总之,当出现该错误时,除了以上几个方面的问题需要你尝试解决,还可能会涉及到MySQL服务器本身的设置,例如超时时间、缓存设置等,你可以根据实际情况调整这些设置来解决该问题。
    

引用chatgpt的解决方法,确实可以解决,方案如下:

jdbc连接串:
jdbc:mysql://192.168.10.12:3306/est_deploy?keepAlive=true&autoReconnect=true&autoReconnectForPools=true&connectTimeout=30000&socketTimeout=60000
druid的配置(询问gpt给出的合理配置范围如下,查看了下确实挺合理的):

{
	"initial-size": 10,
	"min-idle": 5,
	"maxActive": 30,
	"timeBetweenEvictionRunsMillis": 50000,
	"validationQuery": "SELECT 1",
	"testWhileIdle": true,
	"test-on-borrow": false,
	"test-while-idle": false,
	"min-evictable-idle-time-millis": 300000,
	"max-evictable-idle-time-millis": 600000
}

你可能感兴趣的:(数据库)