这种数据访问模式是线程安全的吗?
Is this data access pattern thread-safe?
我实现了 dao.go
文件,实现如下:
type DbClient struct {
db *gorm.DB
}
GetDBClient()
初始化与数据库的连接 returns (*DbClient, error)
func (db *DbClient) Close() {
db.db.Close()
}
- 不同的CRUD方法
DbClient
并且为所有处理程序提供服务的 main.go
文件像这样使用它:
var dbClient *DbClient
func main() {
db, err := GetDBClient()
if err != nil {
panic(err)
}
dbClient = db
defer dbClient.Close()
...
}
因此 main.go
的所有处理程序都使用全局 dbClient
。
这种架构线程安全吗?它是否提供数据库操作的原子性?
这个设计应该不错
sql.DB
处理并发访问并实现池化。 gorm
从中继承了这些特性。
不过我会做一个改变。全局变量很难管理。
您可以将 db
注入到使用它的代码中。
// to be removed
// var dbClient *DbClient
func main() {
db, err := GetDBClient()
if err != nil {
panic(err)
}
defer db.Close()
CodeThatUsesDB(db)
...
}
我实现了 dao.go
文件,实现如下:
type DbClient struct { db *gorm.DB }
GetDBClient()
初始化与数据库的连接 returns(*DbClient, error)
func (db *DbClient) Close() { db.db.Close() }
- 不同的CRUD方法
DbClient
并且为所有处理程序提供服务的 main.go
文件像这样使用它:
var dbClient *DbClient
func main() {
db, err := GetDBClient()
if err != nil {
panic(err)
}
dbClient = db
defer dbClient.Close()
...
}
因此 main.go
的所有处理程序都使用全局 dbClient
。
这种架构线程安全吗?它是否提供数据库操作的原子性?
这个设计应该不错
sql.DB
处理并发访问并实现池化。 gorm
从中继承了这些特性。
不过我会做一个改变。全局变量很难管理。
您可以将 db
注入到使用它的代码中。
// to be removed
// var dbClient *DbClient
func main() {
db, err := GetDBClient()
if err != nil {
panic(err)
}
defer db.Close()
CodeThatUsesDB(db)
...
}