在两个不同的go应用程序中从postgres查询到的不兼容数据



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

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

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

SQL语句的旧返回值类似于

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

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

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,
})
}
}
}

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,
})
}
}
}

最新更新