【问题标题】:AWS RDS Postgres, GORM and transient errorsAWS RDS Postgres、GORM 和瞬态错误
【发布时间】:2022-01-15 09:42:47
【问题描述】:

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

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

【问题讨论】:

    标签: postgresql go amazon-rds go-gorm


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 2017-10-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    相关资源
    最近更新 更多