go - 在多线程应用程序中使用 gorm 的最佳方法是什么?
问题描述
我有一个打开很多例程的应用程序。让我们说2000个例程。每个例程都需要访问数据库,或者至少需要从数据库中更新/选择数据。
我目前的方法如下:
例程 get *gorm.DB
with 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;
}
推荐阅读
- xamarin - Xamarin Prism 无法导航到 LoginPageViewModel
- powerbi - 在 Power BI 中重新排列条形图
- spring-boot - Spring Boot 2.3.4 + OpenJ9:未处理的异常
- python - Python如何获取多行字符串的最后N行
- java - 如何将 db(oracle) 查询的结果存储为全局变量,以在 talend 的 RUN-IF 条件中使用?
- java - JSR Validation @Pattern 允许空值
- java - 如何使用独立 jar 从文件夹中读取文本文件的数量
- python - Opencv人脸检测网络摄像头不保存检测到的人脸
- java - 如何使用 log4j 创建多个自定义日志文件?
- python - (SubscriptionNotFound) 找不到订阅“订阅”