mysql 连接释放问题

指剑对天笑 2020-09-05 09:23:46
func (ctl *RoleModel) GetQxList(req beego.Controller) (result utils.ResData, rerr error) {


var conn = services.NewConnection(utils.GetAppid(req))


defer func() {
_= conn.Close() //释放连接,要不然MYSQL连接会疯涨
if err := recover(); err != nil {
fmt.Println("GetQxList 失败,",err)
rerr = fmt.Errorf("%s",err)
}
}()


//拉取第一层
rows, err := conn.Query( sqls,userid,"0","0");
if err != nil{
panic("查询出错,"+err.Error())
}

for rows.Next() {
QxMenu1 := MyJsonMemu{}
_ = rows.Scan(&QxMenu1.Qxid, &QxMenu1.Name,&QxMenu1.Pid,&QxMenu1.Achk,&QxMenu1.Visible)

//查二层
rows1, err1 := conn.Query(sqls,userid,QxMenu1.Qxid,QxMenu1.Qxid);
if err1 ==nil{
for rows1.Next(){
QxMenu2 := Menu_2{}
_ = rows1.Scan(&QxMenu2.Qxid, &QxMenu2.Name,&QxMenu2.Pid,&QxMenu2.Achk,&QxMenu2.Visible)
//查三层
rows2, err2 := conn.Query(sqlsthree,userid,QxMenu2.Qxid,QxMenu2.Qxid);
if err2 ==nil{
for rows2.Next(){
QxMenu3 := Menu_3{}
_ = rows2.Scan(&QxMenu3.Qxid, &QxMenu3.Name,&QxMenu3.Pid,&QxMenu3.Achk,&QxMenu3.Visible)
QxMenu2.Subs = append(QxMenu2.Subs,QxMenu3)
}
}
_ =rows2.Close()
QxMenu1.Subs = append(QxMenu1.Subs,QxMenu2)
}
}
_= rows1.Close()
QxList = append(QxList,QxMenu1)
}
_ = rows.Close()
rjso,_ := json.Marshal(QxList)

_=json.Unmarshal([]byte(rjso), &result.Result)


}
上面这段代码我想实现循环查询数据库按父子级返回,如果代码里不加 rows.Close() 的话调用一次MYSQL加三个连接而且永远不会释放,
除非重启服务,我想问题有没有更方便的数据库连接释放方法,这样每次都要在后面写rows.Close()觉得很麻烦,万一忘了写或是代码循环出错导至没执行到释放代码启不是会导至连接疯长引起程序崩溃,不知道大哥们是怎么弄的。
...全文
626 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
超级大菠萝666 2020-12-22
  • 打赏
  • 举报
回复
所以问题来了,为什么不使用连接池呢?
北飞的企鹅 2020-10-26
  • 打赏
  • 举报
回复
获取到数据库连接之后立马使用defer close
一根烂笔头 2020-10-15
  • 打赏
  • 举报
回复
楼上正解,你自己也使用了defer,那么可以把row1,row2提前定义,下面使用赋值,而不是快捷定义,然后放到defer函数里close
qybao 2020-09-07
  • 打赏
  • 举报
回复
defer不就是干这事的吗?
比如
rows, err := conn.Query( sqls,userid,"0","0");
if err != nil{
panic("查询出错,"+err.Error())
}
defer rows.Close()

for rows.Next() {
QxMenu1 := MyJsonMemu{}
_ = rows.Scan(&QxMenu1.Qxid, &QxMenu1.Name,&QxMenu1.Pid,&QxMenu1.Achk,&QxMenu1.Visible)
//查二层
rows1, err1 := conn.Query(sqls,userid,QxMenu1.Qxid,QxMenu1.Qxid);
if err1 {
continue
}
defer rows1.Close()
for rows1.Next(){
QxMenu2 := Menu_2{}
_ = rows1.Scan(&QxMenu2.Qxid, &QxMenu2.Name,&QxMenu2.Pid,&QxMenu2.Achk,&QxMenu2.Visible)
//查三层
rows2, err2 := conn.Query(sqlsthree,userid,QxMenu2.Qxid,QxMenu2.Qxid);
if err2 {
continue
}
defer rows2.Close()
for rows2.Next(){
...

2,190

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • Freeman Z
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧