这个数据访问模式是线程安全的吗?

时间:2018-12-11 23:40:03

标签: database go global go-gorm

我已经实现了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
这种体系结构线程安全吗?它是否提供数据库操作的原子性?

1 个答案:

答案 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)
    ...
}