[Go] Golang defer 与 MySQL 连接关闭的陷阱 (database is closed)
在 golang 某些 orm 中,你经常会看到这种用法:
func main() {
db, err := gorm.Open("sqlite3", "test.db")
if err != nil {
panic("failed to connect database")
}
defer db.Close() // db 操作
}
在主逻辑中使用 defer 最后关闭连接是没有问题的。
如果是在模块化开发,我们把一些数据库连接的操作封装到函数中,就不能带有 defer,比如:
func Connect() *gorm.DB {
db, err := gorm.Open("mysql", "root:123456@(xx.xx.xx.xx:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
panic("MySql Connect error")
}
defer db.Close() return db
}
由于 defer 是在逻辑的最后执行的,实际上到 return 的时候,返回的已经是 null。
继续操作会提示:sql: database is closed
那么我们可以把 defer db.Close() 放在具体的 repository 逻辑中。
合理使用 defer 释放资源,可以有效减少资源句柄的占用。
Refer:Golang_defer陷阱
Link:https://www.cnblogs.com/farwish/p/12721687.html
[Go] Golang defer 与 MySQL 连接关闭的陷阱 (database is closed)的更多相关文章
- 记一次网络原因导致的mysql连接中断问题(druid)
date: 2018-04-19 21:00 tag: java,mysql,exception,mat,调试,jvm 工具: gceasy.io, MAT 线上系统出现一个诡异的bug,通过heap ...
- redis mysql 连接池 之 golang 实现
1 mysql 连接池代码 package lib import ( "database/sql" "fmt" "strconv" &quo ...
- 解决Mysql连接池被关闭 ,hibernate尝试连接不能连接的问题。 (默认mysql连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池。系统发布第二天访问链接关闭问题。
解决Mysql连接池被关闭 ,hibernate尝试连接不能连接的问题. (默认MySQL连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池. 所以系统发布第二天访问会 ...
- MySQL连接问题【如何解决MySQL连接超时关闭】
--MySQL连接问题[如何解决MySQL连接超时关闭] ------------------------------------------------转载 最近做网站有一个站要用到WEB网页采集器 ...
- 如何解决MySQL连接超时关闭
最近做网站有一个站要用到WEB网页采集器功能,当一个PHP脚本在请求URL的时候,可能这个被请求的网页非常慢慢,超过了mysql的 wait-timeout时间,然后当网页内容被抓回来后,准备插入到M ...
- Go语言学习笔记(八)golang 操作 Redis & Mysql & RabbitMQ
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 Reids 安装导入 go get github.com/garyburd/redigo/redis import ...
- golang 操作 Redis & Mysql & RabbitMQ
golang 操作 Redis & Mysql & RabbitMQ Reids 安装导入 go get github.com/garyburd/redigo/redis import ...
- Java Mysql连接池配置和案例分析--超时异常和处理
前言: 最近在开发服务的时候, 发现服务只要一段时间不用, 下次首次访问总是失败. 该问题影响虽不大, 但终究影响用户体验. 观察日志后发现, mysql连接因长时间空闲而被关闭, 使用时没有死链检测 ...
- mysql连接的一些问题。
最近网站出现 User 数据库名称 has already more than 'max_user_connections' active connections 的报错,网站瘫痪.有必要研究下这个问 ...
- 【转】MySQL连接超时断开的问题
这遍文章转过来做个笔记,时不时看看. 转:http://blog.csdn.net/nethibernate/article/details/6658855 Exception如下: org.hi ...
随机推荐
- 虚拟现实(VR)在医疗保健中的5种应用
医疗保健中的VR虚拟现实 虚拟现实的由来已久,18世纪,法国的医生使用布制的分娩模拟器向助产师和外科医生教授医学技术.在20世纪60年代初,医生一边对心肺复苏学员口述心肺复苏的技巧,一边使用一家塑料玩 ...
- STL:vector中如何使用at()来避免程序报错
#include <iostream> #include <vector> using namespace std; int main() { vector<int> ...
- XSS 从 PDF 中窃取数据
XSS 从 PDF 中窃取数据 将服务器端 XSS 注入到动态生成的 PDF 中 在 hack the box 的 Book 机器(Scripting Track)上,我遇到了一个 Web 应用程序, ...
- halo【攻防世界】Misc
这是一个傻逼的解题记录 初学自己摸索的菜鸟,欢迎大佬指正(磕头) 题目: 下载打开: 一时间也没啥头绪,丢到CyberChef里面看看 只有base64解码出非乱码字符串 igq4;441R;1ikR ...
- QT数据库学习笔记
简介 QT通过模块化管理,对于某种模块需要添加对应的模块实现.QT SQL也是需要增加对应的模块来实现.QT数据库的层次关系为: 驱动层:数据库到SQL语言之间的桥梁 SQL API层: SQL语句的 ...
- Windows系统使用ODBC驱动访问KingaseES数据库及常见问题解决
Windows系统使用KingbaseES ODBC驱动访问KingaseES数据库及常见问题解决. 一.获取KingbaseES数据库ODBC驱动: 在官网下载KingbaseES数据库安装包,选择 ...
- Python 潮流周刊第 44 期(摘要)+ 赠书 5 本《明解Python算法与数据结构》
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- Java解析json数据(fastjson2)
Json数据 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.它以易于阅读和编写的方式来表示结构化数据,常用于在不同系统之间进行数据交互和传输. JSON使 ...
- 【Java】这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";
String s1 = "a"; String s2 = s1 + "b"; String s3 = "a" + "b" ...
- #树形dp#B 预算缩减
题目 给定一棵树,你需要删去一些边(可以不删),使得剩下的图中每个点所在的连通块大小都\(\geq k\). 求删边的方案数,对\(786433\)取模.两种方案不同,当且仅当存在一条边在一个方案中被 ...