Является ли этот шаблон доступа к данным потокобезопасным? - PullRequest
0 голосов
/ 12 декабря 2018

Я реализовал 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 используют глобальные dbClient.
Безопасна ли эта архитектура потока и обеспечивает атомарность операций с базой данных?

1 Ответ

0 голосов
/ 12 декабря 2018

Этот дизайн должен быть хорошим.

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