[gogf/gf]连接MYSQL数据库 bad connection 和invalid connection

2024-07-09 496 views
9

2021-01-10 03:43:12.972 [ERRO] [252150 ms] [default] SELECT 语句 Error: bad connection

数据库的连接配置

Database. [database] link = "****" maxLifetime = 5 #"(可选,单位秒)连接对象可重复使用的时间长度" maxIdle = 0 #"(可选)连接池最大闲置的连接数" maxOpen = 100 #"(可选)连接池最大打开的连接数" debug = true

Database logger.

[database.logger] Path = "/tmp/log/gf-lanbo/sql" Level = "ERRO" Stdout = true

一天大概会出现两三次 这样的情况

回答

9

@code-cutter 252150 ms那个时间有点问题啊,这个sql执行的时间太长啦!可能是被服务端踢掉了。

6

@code-cutter 我加个超时控制特性吧。

2

理论上我这个执行时间不长的, 但是目前表现出的是这个语句执行时间长, 直接数据库里面查询的话, 只用0.0几ms就够了, 我怀疑是数据库那边问题? 我一直找不出这个问题, 反正就是哪里假死了, 导致整个程序都阻塞了, 一天就那么一两次....

3

@code-cutter 在master分支上新增加以下配置,你可能会感兴趣:

QueryTimeout         time.Duration `json:"queryTimeout"`         // (Optional) Max query time for per dql.
ExecTimeout          time.Duration `json:"execTimeout"`          // (Optional) Max exec time for dml.
TranTimeout          time.Duration `json:"tranTimeout"`          // (Optional) Max exec time time for a transaction.
PrepareTimeout       time.Duration `json:"prepareTimeout"`       // (Optional) Max exec time time for prepare operation.

另外,你的程序是通过容器化运行的吗?有没有对容器的CPU资源做限制?比如K8S的Limits设置?

3

没有做限制,使用的是Ubuntu,程序就编译完直接运行的,有个ulimits我设置过,但是应该不会有太大影响

3

我也遇到这个问题,一直找不到原因,苦恼中!!!

2

@dangwy @code-cutter 你们把QueryTimeout配置加上吧。根据问题的信息我只能猜测是goroutine调度时间过长,或者连接池满了处于等待状态,因为这个时间是将sql和参数提交到底层的go-mysql-driver执行的时间记录,已经是脱离gdb封装包的管理范畴了。

6

这个单位是怎么设置的?毫秒还是秒?

7

image 搞定了,可以这样自定义单位,如果设置的是数值类型的话默认是纳秒

5

我也碰到了这个问题,invalid connection,大概隔一周会出现两三次,无法在本地复现