在两个不同的 go 应用程序中从 postgres 查询的数据不一致

Inconsistant data queried from postgres in two different go applications

我构建了两个 go 应用程序,比如 app1app2,它们都连接到同一个 postgres 数据库。对于每个应用程序,我使用 gorm 作为 ORM。

app1 用于更新数据库,app2 是在 gin 中创建的 API 服务器 从数据库中查询数据。

app2 中,我在程序开始时创建了一个数据库连接池,它在每个 HTTP 端点处理程序中重复使用。在处理程序函数内部,我使用 gorm 执行 SQL 语句,并 returns 结果。

SQL语句的旧return值就像

select count(*) from t_publications --returns--> 2641

当我在 app1 中插入 4 条新记录时,我在 app1psql[ 中都可以获得正确的数据=52=] cli,就像

select count(*) from t_publications --returns--> 2645

然而,当我检查 app2 的 API 端点时,它执行相同的 SQL 语句,它 return 是旧数据

curl localhost:8080/getPublications --returns--> 2641

如果我重新启动 app2,我就可以获得我需要的正确数据。我不确定连接池内连接的生命周期是否有问题,有人可以解释这个问题吗?谢谢

----编辑----

这是我的 app2

处理函数之一
func GetOverview(db *gorm.DB) gin.HandlerFunc {
    var overview Overview
    // the query is just a simple select statement
    err := db.Raw(dbquery.GetOverview).Scan(&overview).Error
    return func(c *gin.Context) {
        if err == nil {
            c.JSON(http.StatusOK, gin.H{
                "status": "ok",
                "data":   overview,
            })
        } else {
            c.JSON(http.StatusInternalServerError, gin.H{
                "status": "internal server error",
                "data":   err,
            })
        }
    }
}

您在 GetOverview 中只执行了一次查询,然后在用作 gin.HandlerFunc 的闭包中返回该查询的结果,本质上缓存了永远在注册处理程序时查询。

解决方案是将查询代码移动到实际的处理程序中:

func GetOverview(db *gorm.DB) gin.HandlerFunc {
    return func(c *gin.Context) {
        var overview Overview
        // the query is just a simple select statement
        err := db.Raw(dbquery.GetOverview).Scan(&overview).Error
        if err == nil {
            c.JSON(http.StatusOK, gin.H{
                "status": "ok",
                "data":   overview,
            })
        } else {
            c.JSON(http.StatusInternalServerError, gin.H{
                "status": "internal server error",
                "data":   err,
            })
        }
    }
}