猿问

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

我已经dao.go通过以下实现实现了文件:

  • type DbClient struct {    db *gorm.DB }

  • GetDBClient()初始化与数据库的连接并返回(*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所以所有使用 global的处理程序dbClient。

这种架构线程安全吗?它是否提供数据库操作的原子性?


ibeautiful
浏览 102回答 1
1回答

忽然笑

这个设计应该不错。sql.DB处理并发访问并实现池化。gorm继承了它的这些特性。不过我会做一个改变。全局变量很难管理。您可以注入db到使用它的代码中。// to be removed// var dbClient *DbClientfunc main() {    db, err := GetDBClient()    if err != nil {        panic(err)    }    defer db.Close()    CodeThatUsesDB(db)    ...} 
随时随地看视频慕课网APP

相关分类

Go
我要回答