У меня есть приложение, которое открывает множество подпрограмм. Допустим, 2000 процедур. Каждая процедура требует доступа к БД или, по крайней мере, требует обновления / выбора данных из БД.
Мой текущий подход следующий:
Подпрограмма получает *gorm.DB
с db.GetConnection()
, это код этой функции:
func GetConnection() *gorm.DB {
DBConfig := config.GetConfig().DB
db, err := gorm.Open("mysql", DBConfig.DBUser+":"+DBConfig.DBPassword+"@/"+DBConfig.DBName+"?charset=utf8mb4")
if err != nil {
panic(err.Error())
}
return db
}
затем подпрограммы вызывают другую функцию из некоторого пакета хранилища и передают *gorm.DB
в функцию и закрывают соединение, это выглядит так:
dbConnection := db.GetConnection()
postStorage.UpdateSomething(dbConnection)
db.CloseConnection(dbConnection)
Выше приведен только пример, основная идея заключается в том, что каждая процедура открывает новое соединение, и мне это не нравится. Потому что это может перегрузить БД. В результате я получил следующую ошибку MySQL:
[mysql] 2020/07/16 19:34:26 packets.go:37: read tcp 127.0.0.1:44170->127.0.0.1:3306: read: connection reset by peer
Вопрос в хорошем шаблоне, как использовать gorm
пакет в многопрограммном приложении?