go之在多线程应用程序中使用gorm的最佳方法是什么

lidabo 阅读:100 2025-06-02 22:19:02 评论:0

我有一个打开很多例程的应用程序。假设有2000个例程。每个例程都需要访问数据库,或者至少需要从数据库更新/选择数据。
我当前的方法如下:
例程使用*gorm.DB获取db.GetConnection(),这是该函数的代码:

func GetConnection() *gorm.DB { 
    DBConfig := config.GetConfig().DB 
    db, err := gorm.Open("mysql", DBConfig.DBUser+":"+DBConfig.DBPassword+"@/"+DBConfig.DBName+"?charset=utf8mb4") 
    if err != nil { 
        panic(err.Error()) 
    } 
    return db 
} 
然后例程从某个存储包中调用另一个函数,并将 *gorm.DB传递给函数并关闭连接,如下所示:
dbConnection := db.GetConnection() 
postStorage.UpdateSomething(dbConnection) 
db.CloseConnection(dbConnection) 
以上仅是示例,主要思想是每个例程都打开新连接,我不喜欢它。因为它可能会使数据库过载。结果我收到了下一个MySQL错误:
[mysql] 2020/07/16 19:34:26 packets.go:37: read tcp 127.0.0.1:44170->127.0.0.1:3306: read: connection reset by peer 
问题是关于好的模式,如何在多例程应用程序中使用 gorm包?

请您参考如下方法:

*gorm.DB是多线程安全的,您可以在多个例程中使用一个*gorm.DB。您可以将其初始化一次,并在需要时获取它。演示:

package db 
 
var db *gorm.DB 
 
fund init() { 
    DBConfig := config.GetConfig().DB 
    db, err := gorm.Open("mysql", DBConfig.DBUser+":"+DBConfig.DBPassword+"@/"+DBConfig.DBName+"?charset=utf8mb4") 
    if err != nil { 
        panic(err.Error()) 
    } 
} 
 
func GetConnection() *gorm.DB { 
    return db; 
} 


标签:多线程
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号