beego mysql 连接池_Golang/beego orm连接mysql 数据库

本文介绍了在使用Beego ORM连接MySQL数据库时遇到的连接超时问题,分析了MySQL的超时机制,并提出了两种解决方案:一是调整数据库配置以延长超时时间,二是设置Beego的连接池超时,使其在超时时自动断开并创建新连接。作者推荐使用后者作为更灵活的解决方案,并提供了具体的API示例。
摘要由CSDN通过智能技术生成

在最近项目开发中遇到一个问题,情况是这样的,第一天数据库操作完全正常的,第二天早上来,就报错invalid connection。

明明第一天都是正常的,第二天来就报错了,这个问题比较尴尬。于是上网搜索后,了解到,原来mysql 连接有超时机制。如下:

interactive_timeout=28800

wait_timeout=28800

默认情况下是28800(8小时)

简单解释一下,就是8小时内,相关连接没有任何操作,那么mysql就会自动关闭这个连接。那么就是解释了,我们项目为什么第一天无任何异常,第二天就报错了(晚上,大家都下班回家睡觉了)。这个连接空闲了超过8小时,就被mysql关闭了,但是beego(我们项目采用的beego框架)连接池并不知晓,然后继续使用这个连接,结果就报错啦。

那么这么解决这个问题呢?

有两种方案:

(1) 修改数据库配置文件,把超时时间配置更长一点。

interactive_timeout= 86,400

wait_timeout= 86,400

这样是24小时超时 ,一般情况下够用了。但是这种方案缺点也很明显,比如重新配置一个服务器也要如此修改配置—比较麻烦。还有就是如果真的超过24小时(比如周末),任然会报错。所以这个方案不太理想

(2) 修改beego mysql连接池设置。把连接超时时间设置短一些,超时后会断开该连接。连接池会自动新建另外一个连接。这样就避免了mysql超时,报错的情况了。这种方式,比较灵活方便,这里也推荐使用这种方式。具体api也贴一下吧:

a. 如果项目中, 直接使用sql.DB,那么直接调用

db.SetConnMaxLifetime(time.Second * 500) //设置连接超时500秒

b. 如果项目中,使用了orm,这种情况稍微复杂一点,因为orm对sql.DB 进行了封装.需要采取先从获取sql.DB,然后在设置超时的方式

sqlDB,err := orm.GetDB("default")

if nil != err{

return nil

}

sqlDB.SetConnMaxLifetime(time.Second * 500)

其中, "default"是数据库别名。

好了,这就是工作中遇到的问题,在这里记录一下吧

作者: hejingdong123

链接: https://blog.csdn.net/hejingdong123/article/details/100653901

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

到此这篇关于“Golang/beego orm连接mysql 数据库”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持Go语言编程网!

相关文章:

好的,关于 Redis 连接池Golang 中的使用,我可以给您提供一些相关的类库和示例代码。 首先,Golang 中比较常用的 Redis 客户端有以下几个: 1. go-redis/redis 2. go-redis/cache 3. redigo 这三个客户端都支持连接池的使用,下面分别介绍一下它们的连接池使用方法。 1. go-redis/redis go-redis/redis 是 Redis 的 Golang 客户端,它提供了一个叫做 "Options" 的结构体,可以用来设置 Redis 连接池的相关选项,例如最大连接数、闲置连接数等等。 示例代码: ```go import ( "github.com/go-redis/redis" ) func main() { options := &redis.Options{ Addr: "localhost:6379", Password: "", // no password set DB: 0, // use default DB PoolSize: 10, } client := redis.NewClient(options) } ``` 在上面的示例代码中,我们创建了一个 Redis 连接池,最大连接数为 10。 2. go-redis/cache go-redis/cache 是 go-redis/redis 的一个扩展库,它提供了一个基于 Redis 的缓存实现。它同样支持 Redis 连接池的使用,可以通过设置 "Options" 结构体中的 "PoolSize" 字段来设置最大连接数。 示例代码: ```go import ( "github.com/go-redis/cache/v8" "github.com/go-redis/redis/v8" ) func main() { options := &redis.Options{ Addr: "localhost:6379", Password: "", // no password set DB: 0, // use default DB PoolSize: 10, } client := redis.NewClient(options) cache := cache.New(&cache.Options{ Redis: client, LocalCache: cache.NewTinyLFU(1000, time.Minute), TTL: time.Hour, }) } ``` 在上面的示例代码中,我们创建了一个 Redis 连接池,最大连接数为 10,并且使用 go-redis/cache 库创建了一个基于 Redis 的缓存实现。 3. redigo redigo 是 Redis 的 Golang 客户端,它同样支持 Redis 连接池的使用,可以通过设置 "Pool" 结构体中的 "MaxIdle" 和 "MaxActive" 字段来设置最大空闲连接数和最大活跃连接数。 示例代码: ```go import ( "github.com/gomodule/redigo/redis" ) func main() { pool := &redis.Pool{ Dial: func() (redis.Conn, error) { return redis.Dial("tcp", "localhost:6379") }, MaxIdle: 10, MaxActive: 100, } conn := pool.Get() } ``` 在上面的示例代码中,我们创建了一个 Redis 连接池,最大空闲连接数为 10,最大活跃连接数为 100。 以上就是三个常用的 Golang Redis 客户端的连接池使用方法,您可以根据实际需求选择适合自己的客户端和连接池设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值