Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 这种数据访问模式是线程安全的吗?_Database_Go_Global_Go Gorm - Fatal编程技术网

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

Database 这种数据访问模式是线程安全的吗?,database,go,global,go-gorm,Database,Go,Global,Go Gorm,我用以下实现实现了dao.go文件: 类型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()

我用以下实现实现了
dao.go
文件:

  • 类型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


这种体系结构是线程安全的吗?它提供了数据库操作的原子性吗?

这种设计应该很好

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