go - gorose 不能创建超过 max_prepared_stmt_count 个语句
问题描述
我将 gorose 用于带有 golang 的 Web 项目,代码如下
var tablecheckrequest = "checkrequest"
func (mysqldao *MysqlDao) GetAllCheckRulesByRequestId(id int) []map[string]interface{} {
result, _ := mysqldao.connection.Table(tablecheckrequest).
Where("requestid", "=", id).Get()
return result
}
一段时间后我明白了
不能创建超过 max_prepared_stmt_count 个语句(当前值:16382)
为什么会发生此错误?
解决方案
我终于知道了!有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)
}
在此方法中,已创建 stmt 但从未关闭!要修复它,我们只需要添加一个 defer stmt.close() 过程中的方法 parseExecute() 就像
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
}
推荐阅读
- php - PHP向mySQL插入数据两次而不是一次和一次有数据和没有数据
- html - 将具有 z-index 的多个 imgs 与 span 对齐
- r - R/dplyr:我如何组合 csv。具有不同变量类型的文件?
- dart - WebSocketException:连接未升级到 websocket
- ios - FBSDKBasicUtility 数组:addObject:无法识别的选择器发送到类 0x107c269a0"
- javascript - 如何从一个 php 文件中获取数据并在另一个 php 文件中检索它
- selenium - Selenium webdriver 版本不正确时不会退出
- javascript - 更新时反应钩子状态未定义
- javascript - 在静态网页上轻轻转发我的 Eclipse 运行时
- javascript - 使用 Javascript 构建 JSON 文件