AWS RDS Postgres、GORM 和瞬态错误

分享于2022年07月17日 amazon-rds go go-gorm postgresql 问答
【问题标题】:AWS RDS Postgres、GORM 和瞬态错误(AWS RDS Postgres, GORM and transient errors)
【发布时间】:2022-01-15 09:42:47
【问题描述】:

我正在使用 Golang、GORM 和云数据库 (AWS RDS Postgres)

考虑到这一点,我们都知道瞬态错误在云环境中是自然的和预期的,因此数据库操作应该对此类错误具有弹性。 也就是说,GORM/sql 驱动程序是否提供了这种开箱即用的机制或任何内置支持来确定哪些错误可以安全重试? 还是我需要手动处理弹性策略和重试逻辑? 如果是这样,是否有任何特定于 golang 的流行库/工具可供选择?


【解决方案1】:

如果你使用的是 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
}

  • 所以我需要手动处理错误,我的意思是,没有内置的方法来处理众所周知的瞬态错误,检查 postgres 错误代码??
  • 您可以查看以下内容: github.com/craigmj/golly