AWS RDS Postgres、GORM 和瞬态错误
Posted
技术标签:
【中文标题】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以上是关于AWS RDS Postgres、GORM 和瞬态错误的主要内容,如果未能解决你的问题,请参考以下文章
在另一个 AWS 账户中创建 RDS/Postgres 副本?
如何仅提取 AWS RDS(Postgres 数据库)中的更改数据(CDC)并将更改数据转储到另一个 RDS postgres 实例?