[Go] Golang defer 与 MySQL 连接关闭的陷阱 (database is closed)

摘要:
在某些形式的高尔夫中,您经常会看到这样的用法:funcmin(){db,err:=gorm.Openifer!如果我们是以模块化的方式开发,我们可以将一些数据库连接操作封装到函数中而不使用defer,例如:funcConnect()*gorm.db{db,err:=gorm.Open(“mysql”,“root:123456@(xx.xx.xx:3306)/dbname?=nil{panic}deferdb.Close()Returndb}因为defer是在逻辑末尾执行的,事实上,在返回时,返回的值为空。如果继续,系统将提示您:sql:databaseclosed,然后我们可以放置defedb。在特定存储库逻辑中关闭()。合理使用延迟释放资源可以有效减少资源句柄的占用。

在 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 释放资源,可以有效减少资源句柄的占用。

Link:https://www.cnblogs.com/farwish/p/12721687.html

免责声明:文章转载自《[Go] Golang defer 与 MySQL 连接关闭的陷阱 (database is closed)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JavaScript数据类型之数字类型【网络与系统安全】关于SSL/TSL协议的分析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Asp.Net开源服务端框架,WebApi后端框架(C#.NET)

本文主要介绍了基于Asp.Net平台、C#语言+SQL数据库的服务器的WebApi后端框架。K=WebApi&c=1&p=1.NETWebApi开发框架|MVC框架|后端框架|服务器框架-标准版本V1.0适用开发:快速构建支持多个客户端的服务器程序,并支持APP、B/S、c/S跨平台移动终端等。C/S系统开发框架的高级版本或更高版本支持多种后...

ABB机器人功能程序(FUNC)

功能程序的应用范围非常广泛。熟练的人员可以根据不同的需求创建相应的功能程序。函数程序的固定格式是FUNC,返回结束。在ABB的学习中,许多学生对功能程序几乎一无所知,即使他们真的在使用它。在学习ABB的过程中,我遇到了几个用例,所以我总结了它们以加深我的理解。...

excel下划线转驼峰公式

最近,为了避免麻烦,我决定生成jquery的json对象结构。数据表。下划线应变成驼峰,如下所示:=LEFT&MID...

PHP 垃圾回收机制(转)

GC进程通常从每个会话开始运行。GC的目的是在会话文件过期__destruct/unset__destruct()析构函数后自动销毁和删除它们。PHP将使用全局变量session.gc_Probability和session.gc_advisor的值session.gc_Probability=1,...

FoxMail 7.2的邮件存储目录修改

在FoxMail升级到7.x之后,邮件的存储路径和策略也发生了变化。许多朋友想更改FoxMail 7.2邮件的位置,因为他们担心重新安装系统时会占用磁盘C上的空间或丢失邮件。但是,FoxMail设置界面中没有提供相应的功能。我们该怎么办?同样,如果您想将邮件存储在磁盘D上,则需要执行以下操作:1.退出运行FoxMail,而不重新安装它。...

Minio创建访问策略

创建固定访问策略使用mcadminpolicy创建罐装政策。服务器提供罐装政策的默认设置,即writeonly,readonly和readwrite。创建新的罐头策略文件策略.json{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":[//可以做出的行动(权限)"s3:ListAl...