Pgxpool 在扫描时返回“池已关闭”错误
来源:stackoverflow
时间:2024-04-09 22:21:34 179浏览 收藏
目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《Pgxpool 在扫描时返回“池已关闭”错误》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~
我正在尝试在新的 go 应用程序中实现 pgxpool。尝试扫描结构后,我不断收到“池已关闭”错误。
连接后,pgx 记录器给了我这个。我认为 pgxpool 应该保持开放。
{"level":"info","msg":"关闭连接","pid":5499,"time":"2022-02-24t16:36:33+10:30"}
这是我的路由器代码
func router() http.handler { var err error config, err := pgxpool.parseconfig(os.getenv("database_url")) if err != nil { log.fatalln(err) } log.println(os.getenv("database_url")) logruslogger := &logrus.logger{ out: os.stderr, formatter: new(logrus.jsonformatter), hooks: make(logrus.levelhooks), level: logrus.infolevel, exitfunc: os.exit, reportcaller: false, } config.connconfig.logger = newlogger(logruslogger) db, err := pgxpool.connectconfig(context.background(), config) if err != nil { log.fatalln(err) } defer db.close() --- minio connection rs := newappresource(db, mc)
然后,在辅助文件中我设置资源
type appresource struct { db *pgxpool.pool mc *minio.client } // newappresource function to pass global var func newappresource(db *pgxpool.pool, mc *minio.client) *appresource { return &appresource{ db: db, mc: mc, } }
此代码末尾发生“池已关闭”错误
func (rs *appResource) login(w http.ResponseWriter, r *http.Request) { var user User var login Login d := json.NewDecoder(r.Body) d.DisallowUnknownFields() // catch unwanted fields err := d.Decode(&login) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } if err != nil { fmt.Println("can't decode JSON", err) } if login.Email == "" { log.Println("empty email") return } log.Println(login.Email) log.Println(login.Password) if login.Password == "" { log.Println("empty password") return } // optional extra check if d.More() { http.Error(w, "extraneous data after JSON object", http.StatusBadRequest) return } sqlStatement := "SELECT user_id, password FROM users WHERE active = 'true' AND email = ?" row := rs.db.QueryRow(context.Background(), sqlStatement, login.Email) err = row.Scan(&user.UserId, &user.Password) if err == sql.ErrNoRows { log.Println("user not found") http.Error(w, err.Error(), http.StatusUnauthorized) return } if err != nil { log.Println(err) http.Error(w, err.Error(), http.StatusInternalServerError) return }
正确答案
您似乎正在执行以下操作:
func router() http.Handler { db, err := pgxpool.ConnectConfig(context.Background(), config) if err != nil { log.Fatalln(err) } defer db.Close() return appResource{db: db} }
问题在于,当函数 router()
结束时,defer db.close()
运行,并且这是在实际使用返回的 pgxpool.pool
之前(返回的 http.handler
将在稍后使用 http 时使用)请求已处理)。尝试使用关闭的 pgxpool.pool
会导致您看到的错误。
最简单的解决方案是简单地删除 defer db.close()
但是您也可以考虑调用 db.close()
作为干净关闭过程的一部分(只要您正在处理请求,它就需要保持打开状态) )。
您正在使用 pgxpool
,它与标准库不同;但我相信 standard library docs 中给出的建议适用于此:
很少需要关闭数据库。
理论要掌握,实操不能落!以上关于《Pgxpool 在扫描时返回“池已关闭”错误》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!
-
502 收藏
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
139 收藏
-
204 收藏
-
325 收藏
-
477 收藏
-
486 收藏
-
439 收藏
-
357 收藏
-
352 收藏
-
101 收藏
-
440 收藏
-
212 收藏
-
143 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习