为了账号安全,请及时绑定邮箱和手机立即绑定

Gorm 与 Postgres 太多客户端问题

Gorm 与 Postgres 太多客户端问题

Go
函数式编程 2023-06-01 18:21:06
我的管理包设置中有这样的数据库连接,模板文件:type Template struct{}func NewAdmin() *Template {   return &Template{}}数据库文件:type Database struct {   T *Template}func (admin *Database) DB() *gorm.DB {    db, err := gorm.Open("postgres", "host=localhost port=5010 user=postgres dbname=postgres password=password sslmode=disable")    if err != nil {       panic(err)    }    return db}现在我在我的控制器包中使用该连接,就像这样控制器模板type Template struct {  Connection *admin.Database}配置文件:type ProfilesController struct {  T *Template}func (c *ProfilesController) ProfileList(ec echo.Context) error {  profile := []models.Profile{}  c.T.Connection.DB().Find(&profile)  if len(profile) <= 0 {      reply := map[string]string{"Message": "No Profiles Found", "Code": "204"}      return ec.JSON(http.StatusBadRequest, reply)  }  return ec.JSON(http.StatusOK, profile)}现在一切正常,但我现在已经开始构建这个 api 的前端。我收到pq: sorry, too many clients already大约 96 个左右的请求。所以我通过邮递员运行它并得到了相同的结果。这就是我为纠正这个问题所做的,db := *c.T.Connection.DB()db.Find(&profile)defer db.Close()现在这似乎可行了,我通过邮递员推送了 500 多个请求,并且运行良好。我是客人,它db.Close()正在那里提供帮助。但是我已经读到连接是一个池,那么原始代码是否应该在不需要关闭连接的情况下工作?我认为空闲连接是由系统释放的,而不是用它们完成的?我还读到,由于它是一个游泳池,所以不好用db.Close()。所以我有点困惑?我为解决连接问题所做的工作是否有效?或者,还有更好的方法?非常感谢。
查看完整描述

1 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

您只需要创建一个连接,并返回相同的实例:


type Database struct {

    T *Template

}


var db *gorm.DB


func init() {

    var err error

    db, err = gorm.Open("postgres", "host=localhost port=5010 user=postgres dbname=postgres password=password sslmode=disable")


    if err != nil {

         panic(err)

    }

}


func (admin *Database) DB() *gorm.DB {       

    return db

}


查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信