在 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. 5G时代,3DCAT助力AR/VR内容上云

    一.5G网络三大应用场景 目前中国的5G技术正在加速发展,5G网络拥有增强型移动宽带.超高可靠低时延通信.海量机器类通信三大技术特点和应用场景.其中增强型移动宽带技术特点与AR&VR行业相关, ...

  2. 记录--20行js就能实现逐字显示效果???-打字机效果

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 效果演示 横版 竖版 思路分析 可以看到文字是一段一段的并且独占一行,使用段落标签p表示一行 一段文字内,字是一个一个显示的,所以这里每一 ...

  3. 记录--vue3实现excel文件预览和打印

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在前端开发中,有时候一些业务场景中,我们有需求要去实现excel的预览和打印功能,本文在vue3中如何实现Excel文件的预览和打印 ...

  4. 记录--有关uni-app如何实现路由拦截的知识分享

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 随着业务的需求,项目需要支持H5.各类小程序以及IOS和Android,这就需要涉及到跨端技术,不然每一端都开发一套,人力成本和维护 ...

  5. FFmpeg开发笔记(七)欧拉系统编译安装FFmpeg

    FFmpeg支持Linux.macOS.Windows.Android等操作系统,其中Linux系列包括Ubuntu.Debian.Mint.CentOS.RHEL.Fedora等分支.FFmpeg官 ...

  6. 《On Java 8》笔记 2

    第十一章 内部类 Java 8 的 Lambda 表达式和方法引用减少了编写内部类的需求 外部类可以提供一个方法返回一个指向内部类的引用 链接外部类 内部类还拥有其外部类的所有元素的访问权 使用 .t ...

  7. .NET分布式Orleans - 7 - Streaming

    概念 在Orleans中,Streaming是一组API和功能集,它提供了一种构建.发布和消费数据流的方式. 这些流可以是任何类型的数据,从简单的消息到复杂的事件或数据记录.Streaming API ...

  8. sql分页遍历出现重复数据原因与解决方案

    1. 问题描述 有同时反馈,直接通过如下的sql进行分页查询,分页会出现重复数据,于是乎我专门查了相关了资料,整理了一下. -- 根据sort字段对dbname进行排序,每五百条数据一页 SELECT ...

  9. 现代DevOps如何改变软件开发格局

    在软件开发的早期,该过程通常是开发人员编写代码,再将其交给质量保证(QA)进行测试.这种瀑布开发方法可能会导致质量问题和延迟,因为问题是在周期后期发现的. 一.了解DevOps和测试左移 DevOps ...

  10. AtCoder Grand Contest 037(without F)

    AGC037 A - Dividing a String 洛谷传送门 AGC037A 分析 考虑每一段长度只可能是一或二,设 \(dp[i]\) 表示以 \(i\) 为结尾的前缀最多可以分成多少段. ...