在 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)的更多相关文章

  1. 记一次网络原因导致的mysql连接中断问题(druid)

    date: 2018-04-19 21:00 tag: java,mysql,exception,mat,调试,jvm 工具: gceasy.io, MAT 线上系统出现一个诡异的bug,通过heap ...

  2. redis mysql 连接池 之 golang 实现

    1 mysql 连接池代码 package lib import ( "database/sql" "fmt" "strconv" &quo ...

  3. 解决Mysql连接池被关闭 ,hibernate尝试连接不能连接的问题。 (默认mysql连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池。系统发布第二天访问链接关闭问题。

    解决Mysql连接池被关闭  ,hibernate尝试连接不能连接的问题. (默认MySQL连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池. 所以系统发布第二天访问会 ...

  4. MySQL连接问题【如何解决MySQL连接超时关闭】

    --MySQL连接问题[如何解决MySQL连接超时关闭] ------------------------------------------------转载 最近做网站有一个站要用到WEB网页采集器 ...

  5. 如何解决MySQL连接超时关闭

    最近做网站有一个站要用到WEB网页采集器功能,当一个PHP脚本在请求URL的时候,可能这个被请求的网页非常慢慢,超过了mysql的 wait-timeout时间,然后当网页内容被抓回来后,准备插入到M ...

  6. Go语言学习笔记(八)golang 操作 Redis & Mysql & RabbitMQ

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 Reids 安装导入 go get github.com/garyburd/redigo/redis import ...

  7. golang 操作 Redis & Mysql & RabbitMQ

    golang 操作 Redis & Mysql & RabbitMQ Reids 安装导入 go get github.com/garyburd/redigo/redis import ...

  8. Java Mysql连接池配置和案例分析--超时异常和处理

    前言: 最近在开发服务的时候, 发现服务只要一段时间不用, 下次首次访问总是失败. 该问题影响虽不大, 但终究影响用户体验. 观察日志后发现, mysql连接因长时间空闲而被关闭, 使用时没有死链检测 ...

  9. mysql连接的一些问题。

    最近网站出现 User 数据库名称 has already more than 'max_user_connections' active connections 的报错,网站瘫痪.有必要研究下这个问 ...

  10. 【转】MySQL连接超时断开的问题

      这遍文章转过来做个笔记,时不时看看. 转:http://blog.csdn.net/nethibernate/article/details/6658855 Exception如下: org.hi ...

随机推荐

  1. 【Unity干货教程】如何实现Unity和Android原生互相调用?

    Unity是一个跨平台开发工具,发布到移动平台也是大部分Unity开发者的必备技能.而由于Unity跨平台的特性,总会遇到在移动平台的技术细节支持不够,或者需要在调用其他原生插件的情况.这里我们说一下 ...

  2. 如何在UE4中播放本地视频文件?

    在UE4中有一套媒体框架方法,它根据视频源的不同,对应的播放方式也不一样,支持的视频源有本地视频文件.影像序列.视频流.实时视频截图.播放形式可选择在场景内的静态网格上播放或者以UI的形式播放.本文主 ...

  3. 说说Vue 3.0中Treeshaking特性?举例说明一下?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术,专业术语叫 Dead code eliminat ...

  4. #二叉堆#JZOJ 4320 旅行

    分析 有一个很重要的性质就是如果经过道路数为奇数,把两个点到根节点的路径长加起来就是两个点间的路径长(正负消掉了) 而且众所周知的是奇数+偶数=奇数 可以预处理每个点到根节点的路径长度(按照题目要求) ...

  5. 基于文件语义实现S3接口语义的注意事项

    本文标题中提到的文件语义,指的是POSIX规范. S3指的是AWS提供的对象存储服务以及相关接口.为方便描述,下文中以对象语义替代S3接口语义. 文件语义和对象语义存在比较多的差异. 对象语义不支持文 ...

  6. OpenHarmony自定义组件介绍

      一.创建自定义组件 在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件.在进行 UI 界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑 ...

  7. 深入了解 Python MongoDB 操作:排序、删除、更新、结果限制全面解析

    Python MongoDB 排序 对结果进行排序 使用 sort() 方法对结果进行升序或降序排序. sort() 方法接受一个参数用于"字段名",一个参数用于"方向& ...

  8. 利用BCEL字节码构造内存马

    ****# 前言 BCEL加载类有一个特点,只可以加载jdk原生的类,其它框架的类,都会报错ClassnotFound的错误.但是,BCEL的ClassLoader在8u252后被删除了 注入流程分析 ...

  9. Linux 使用 crontab 定时拆分日志、清理过期文件

    @ 目录 前言 简介 一.准备工作 1.1 创建写入脚本 1.2 设置执行权限 1.3 添加定时任务 1.4 配置生效 二.Tomcat日志 按每天分割 2.1 创建一个 sh文件 2.2 设置执行权 ...

  10. cmd中怎么清屏--cls

    平时我们在 Linux 系统中清除屏幕 用的命令是:  clear 现在在Windows上用的清屏命令是 : cls