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()覺得很麻煩,萬一忘了寫或是代碼回圈出錯導至沒執行到釋放代碼啟不是會導至連接瘋長引起程式崩潰,不知道大哥們是怎么弄的。
uj5u.com熱心網友回復:
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(){
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/8691.html
標籤:go語言
