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

问题描述 投票:0回答:1

我已经构建了两个go应用程序,例如app1app2,它们都连接到相同的postgres数据库。对于每个应用程序,我将gorm用作ORM。

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

app2中,我在程序的开头创建了一个数据库连接池,并在每个HTTP端点处理程序中重用了它。在处理程序函数中,我使用gorm执行一条SQL语句并返回结果。

SQL语句的旧返回值就像

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

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

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

但是,当我检查执行同一条SQL语句的app2的API端点时,它会返回旧数据

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,
            })
        }
    }
}
postgresql go gorm gin-gonic
1个回答
0
投票

您只在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,
            })
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.