dsf487787 2018-06-03 05:30 采纳率: 100%
浏览 335

gorose不能创建超过max_prepared_stmt_count条语句

I use gorose for web project with golang ,code like

var tablecheckrequest = "checkrequest"

func (mysqldao *MysqlDao) GetAllCheckRulesByRequestId(id int) []map[string]interface{} {
    result, _ := mysqldao.connection.Table(tablecheckrequest).
    Where("requestid", "=", id).Get()
    return result
}

After a time I get this

Can't create more than max_prepared_stmt_count statements (current value: 16382)

Why is this error happening?

  • 写回答

1条回答 默认 最新

  • dongyi1921 2018-06-04 05:15
    关注

    I find out it finally! There is the source code of gorose

    func (dba *Database) Execute(args ...interface{}) (int64, error) {
    //defer DB.Close()
    lenArgs := len(args)
    var sqlstring string
    var vals []interface{}
    
    sqlstring = args[0].(string)
    
    if lenArgs > 1 {
        for k, v := range args {
            if k > 0 {
                vals = append(vals, v)
            }
        }
    }
    // 记录sqllog
    //Connect.SqlLog = append(Connect.SqlLog, fmt.Sprintf(sqlstring, vals...))
    dba.LastSql = fmt.Sprintf(sqlstring, vals...)
    dba.SqlLogs = append(dba.SqlLogs, dba.LastSql)
    
    var operType string = strings.ToLower(sqlstring[0:6])
    if operType == "select" {
        return 0, errors.New("this method does not allow select operations, use Query")
    }
    
    if dba.trans == true {
        stmt, err := tx.Prepare(sqlstring)
        if err != nil {
            return 0, err
        }
        return dba.parseExecute(stmt, operType, vals)
    }
    
    stmt, err := DB.Prepare(sqlstring)
    if err != nil {
        return 0, err
    }
    return dba.parseExecute(stmt, operType, vals)
    }
    

    during this method a stmt has been create but never close! to fix it we just need to add a defer stmt.close() durging method parseExecute() just like

    func (dba *Database) parseExecute(stmt *sql.Stmt, operType string, vals []interface{}) (int64, error) {
    defer stmt.Close()
    var rowsAffected int64
    var err error
    result, errs := stmt.Exec(vals...)
    if errs != nil {
        return 0, errs
    }
    
    switch operType {
    case "insert":
        // get rows affected
        rowsAffected, err = result.RowsAffected()
        dba.RowsAffected = int(rowsAffected)
        // get last insert id
        rowsAffected, err = result.LastInsertId()
        dba.LastInsertId = int(rowsAffected)
    case "update":
        rowsAffected, err = result.RowsAffected()
    case "delete":
        rowsAffected, err = result.RowsAffected()
    }
    
    return rowsAffected, err
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题