我已经实现了dao.go
文件,其实现如下:
type DbClient struct {
db *gorm.DB
}
GetDBClient()
初始化与数据库的连接并返回(*DbClient, error)
func (db *DbClient) Close() {
db.db.Close()
}
DbClient
的不同CRUD方法为所有处理程序提供服务的main.go
文件会像这样使用它:
var dbClient *DbClient
func main() {
db, err := GetDBClient()
if err != nil {
panic(err)
}
dbClient = db
defer dbClient.Close()
...
}
因此main.go
的所有处理程序都使用全局dbClient
。
这种体系结构线程安全吗?它是否提供数据库操作的原子性?
答案 0 :(得分:1)
这种设计应该很好。
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)
...
}