使用beego版本 v2.0.2
beego官网地址:现在网上的地址大部分都不对,从github源码库看文档地址
踩坑问题
- 按照官网的方法
bee.exe我的没有生成。我手动去bee包目录下执行go build打包出了bee.exe,复制到bin下。 - 接收
ajax的json参数要必须要配置conf目录下app.conf添加一行
CopyRequestBody = true
关于beego orm
beego orm 不推荐使用,多表联查问题非常多,建议使用gorm
解决超时问题 invalid connection
发生原因: wait_timeout的作用是,设置非交互连接(就是指那些连接池方式、非客户端方式连接的)的超时时间,超过这个时间,mysql服务器会主动切断那些已经连接的,但是状态是sleep的连接。 orm 没有配置这个时间,程序在重复使用数据库tcp连接池时,该命中连接可能已被服务器断开,而程序orm这边认为该连接没有过期,还有效。此时会报错 invalid connection。
解决办法:和数据库同步过期时间,
设置SetConnMaxLifetime参数,要根据你数据库的 wait_timeout字段大小去设置,要比这个时间小
mysql执行:SHOW VARIABLES LIKE '%timeout%' 得到wait_timeout时间
添加beego orm 配置项
dbURL := "你自己的配置"
orm.RegisterDataBase("default", "mysql", dbURL)
//这里是解决问题的关键
db, _ := orm.GetDB("default")
//配置比数据库 wait_timeout小的值,我的默认是120,这里比数据库小20
db.SetConnMaxLifetime(100)
也可以动态查询,然后自动去算
o := orm.NewOrm()
var list []orm.Params
_, err := o.Raw("SHOW VARIABLES LIKE '%timeout%'").Values(&list)
if err != nil {
logs.Info("查询失败")
}
for _, item := range list {
if item["Variable_name"] == "wait_timeout" {
waitTimeout := item["Value"].(string)
num, err := strconv.ParseInt(waitTimeout, 10, 64)
if err != nil {
logs.Error("转换失败:", err)
continue
}
// 设置连接池超时时间,要比数据库的wait_timeout设置时间要小,否则mysql断开了连接池
db, _ := orm.GetDB("default")
db.SetConnMaxLifetime(time.Duration(num-10) * time.Second)
}
}