【发布时间】:2022-01-15 09:42:47
【问题描述】:
我正在使用 Golang、GORM 和云数据库 (AWS RDS Postgres)
考虑到这一点,我们都知道瞬态错误在云环境中是自然的和预期的,因此数据库操作应该对此类错误具有弹性。 也就是说,GORM/sql 驱动程序是否提供了这种开箱即用的机制或任何内置支持来确定哪些错误可以安全重试? 还是我需要手动处理弹性策略和重试逻辑? 如果是这样,是否有任何特定于 golang 的流行库/工具可供选择?
我正在使用 Golang、GORM 和云数据库 (AWS RDS Postgres)
考虑到这一点,我们都知道瞬态错误在云环境中是自然的和预期的,因此数据库操作应该对此类错误具有弹性。 也就是说,GORM/sql 驱动程序是否提供了这种开箱即用的机制或任何内置支持来确定哪些错误可以安全重试? 还是我需要手动处理弹性策略和重试逻辑? 如果是这样,是否有任何特定于 golang 的流行库/工具可供选择?
如果你使用的是 GORM,你可以使用内置的错误处理,比如
if err := db.Where("name = ?", "jinzhu").First(&user).Error; err != nil {
// error handling...
}
这是 list of o all the possible GORM errors to handle
这是一个使用 GORM 重试连接到 SQL 服务器的示例。
type errorLogger func(err error, msg string)
// NewPostgresDb creates a db instance, if connection fails, panics. With re-try functionality.
// logger may be nil.
func NewPostgresDb(connectionUrl string, retries int, logger errorLogger) *gorm.DB {
var db *gorm.DB
var err error
db, err = gorm.Open("postgres", connectionUrl)
for err != nil {
if logger != nil {
logger(err, fmt.Sprintf("Failed to connect to database (%d)", retries))
}
if retries > 1 {
retries--
time.Sleep(5 * time.Second)
db, err = gorm.Open("postgres", connectionUrl)
continue
}
panic(err)
}
db.SingularTable(true)
return db
}