go语言的stmt是否需要手动关闭?

如题,最近一个go项目出现panic,(这个项目是一直运行用来监听几个接口)一看输出日志,发现报了这个错误:

Error:Error 1461: Can't create more than max_prepared_stmt_count statements (current value: 16382)
panic: runtime error: invalid memory address or nil pointer dereference

我一看数据库已经是这样的状态了:

mysql> show global status like 'com_stmt%';

Variable_name Value
Com_stmt_close 15961
Com_stmt_execute 27579
Com_stmt_fetch 0
Com_stmt_prepare 35281
Com_stmt_reprepare 0
Com_stmt_reset 0
Com_stmt_send_long_data 0

我一开始以为是并发数太大,但是感觉并没有那么大的并发请求,后来看了看代码(代码也不是我写的,不是很熟悉),发现代码是这样的(SQL语句就拿XXXX替换了哈):

    stmt, err := db.Prepare(`XXXXXXXXXXXXXXXXXXX`)
    checkErr(err)
    res, err := stmt.Exec(XXXXXXXXXXXX)
    checkErr(err)
    id, err := res.LastInsertId()
    checkErr(err)
    fmt.Println("XXXXXXXXXX")

我发现代码中没有stmt.close()之类的操作,请问各位大佬,这个是不是出现本次问题的原因呢?如果不是的话有可能是什么原因呢?

阅读 9.3k
1 个回答

还是要关的

stmt, err := db.Prepare(`XXXXXXXXXXXXXXXXXXX`)
checkErr(err)
defer stmt.Close() //关闭之
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题