我有一个可以打开很多例程的应用程序。假设有 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
}
Run Code Online (Sandbox Code Playgroud)
然后例程从某个存储包调用另一个函数并传递*gorm.DB给函数并关闭连接,它看起来像这样:
dbConnection := db.GetConnection()
postStorage.UpdateSomething(dbConnection)
db.CloseConnection(dbConnection)
Run Code Online (Sandbox Code Playgroud)
上面只是示例,主要思想是每个例程都会打开新连接,我不喜欢它。因为它可能会使数据库过载。结果我得到了下一个 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
Run Code Online (Sandbox Code Playgroud)
问题是关于如何gorm在多例程应用程序中使用包的好模式?
*gorm.DB是多线程安全的,您可以*gorm.DB在多个例程中使用它。您可以初始化一次并在需要时随时获取它。演示:
package db
var db *gorm.DB
func 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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2993 次 |
| 最近记录: |