Beego框架遇到的问题和解决方法

483 阅读2分钟

使用beego版本 v2.0.2

beego官网地址:现在网上的地址大部分都不对,从github源码库看文档地址

踩坑问题

  • 按照官网的方法 bee.exe 我的没有生成。我手动去bee包目录下执行 go build 打包出了bee.exe,复制到bin下。
  • 接收ajaxjson参数要必须要配置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时间

image.png

添加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)
		}
	}