登录
首页 >  Golang >  Go问答

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

来源:SegmentFault

时间:2023-02-23 08:29:52 318浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《go语言的stmt是否需要手动关闭?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下MySQL、go,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

如题,最近一个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()之类的操作,请问各位大佬,这个是不是出现本次问题的原因呢?如果不是的话有可能是什么原因呢?

正确答案

还是要关的

stmt, err := db.Prepare(`XXXXXXXXXXXXXXXXXXX`)
checkErr(err)
defer stmt.Close() //关闭之

今天带大家了解了MySQL、go的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表