在两个不同的 go 应用程序中从 postgres 查询的数据不一致
Inconsistant data queried from postgres in two different go applications
我构建了两个 go 应用程序,比如 app1 和 app2,它们都连接到同一个 postgres 数据库。对于每个应用程序,我使用 gorm 作为 ORM。
app1 用于更新数据库,app2 是在 gin 中创建的 API 服务器 从数据库中查询数据。
在 app2 中,我在程序开始时创建了一个数据库连接池,它在每个 HTTP 端点处理程序中重复使用。在处理程序函数内部,我使用 gorm 执行 SQL 语句,并 returns 结果。
SQL语句的旧return值就像
select count(*) from t_publications --returns--> 2641
当我在 app1 中插入 4 条新记录时,我在 app1 和 psql[ 中都可以获得正确的数据=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,
})
}
}
}
我构建了两个 go 应用程序,比如 app1 和 app2,它们都连接到同一个 postgres 数据库。对于每个应用程序,我使用 gorm 作为 ORM。
app1 用于更新数据库,app2 是在 gin 中创建的 API 服务器 从数据库中查询数据。
在 app2 中,我在程序开始时创建了一个数据库连接池,它在每个 HTTP 端点处理程序中重复使用。在处理程序函数内部,我使用 gorm 执行 SQL 语句,并 returns 结果。
SQL语句的旧return值就像
select count(*) from t_publications --returns--> 2641
当我在 app1 中插入 4 条新记录时,我在 app1 和 psql[ 中都可以获得正确的数据=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,
})
}
}
}