如果是mysql数据库的话,数据库本身有一个超时时间,超过这个时间,数据库自动就断开连接

查看数据库断开连接时间

show global variables like "%timeout%"

主要看 interactive_timeout 和 wait_timeout 的值。 (interactive_timeout针对交互式连接,wait_timeout针对非交互式连接。所谓的交互式连接,即在mysql_real_connect()函数中使用了CLIENT_INTERACTIVE选项。说得直白一点,通过mysql客户端连接数据库是交互式连接,通过jdbc连接数据库是非交互式连接。 在连接启动的时候,根据连接的类型,来确认会话变量wait_timeout的值是继承于全局变量wait_timeout,还是interactive_timeout)

SetMaxOpenConns用于设置最大打开的连接数,默认值为0表示不限制。
SetMaxIdleConns用于设置闲置的连接数。
SetConnMaxLifetime(time.Duration(8*3600) * time.Second) //设置超时时间(不设置就默认永久有效)

这就存在一个问题:如果sqlx连接池长时间没有连接数据库,数据库就会自动断开,这时候就会导致连接错误

[mysql] 2019/12/25 20:04:44 packets.go:36: read tcp 127.0.0.1:60160->127.0.0.1:3
306: wsarecv: An established connection was aborted by the software in your host
machine.

解决办法2中:

1 在数据库连接失效之前程序自动连接一次数据库(不推举)。

2 设置SetConnMaxLifetime失效时间,和数据库失效时间保持一致即可 SetConnMaxLifetime(time.Duration(8*3600) * time.Second)

点赞(387)

评论列表共有 0 条评论

立即
投稿
返回
顶部