Gorm 与 Postgres 太多客户端问题
Gorm With Postgres Too Many Client Issue
我的管理包设置中有这样的数据库连接,
模板文件:
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 构建前端。在大约 96 个左右的请求后,我得到 pq: sorry, too many clients already
。
所以我 运行 它通过邮递员得到了相同的结果。这就是我为解决问题所做的工作,
db := *c.T.Connection.DB()
db.Find(&profile)
defer db.Close()
现在这似乎行得通了,我通过邮递员推送了 500 多个请求,并且工作正常。我是那里的 db.Close()
的客人。
但是我读到连接是一个池,那么原始代码是否应该在不需要关闭连接的情况下工作?我认为空闲连接是由系统释放的,而不是用它们完成的?我还读到,由于它是一个游泳池,所以不好用 db.Close()
。
所以我有点困惑?我为解决连接问题所做的工作是否有效?或者有更好的方法吗?
非常感谢。
您只需要创建一个连接,return 同一个实例:
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
}
我的管理包设置中有这样的数据库连接,
模板文件:
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 构建前端。在大约 96 个左右的请求后,我得到 pq: sorry, too many clients already
。
所以我 运行 它通过邮递员得到了相同的结果。这就是我为解决问题所做的工作,
db := *c.T.Connection.DB()
db.Find(&profile)
defer db.Close()
现在这似乎行得通了,我通过邮递员推送了 500 多个请求,并且工作正常。我是那里的 db.Close()
的客人。
但是我读到连接是一个池,那么原始代码是否应该在不需要关闭连接的情况下工作?我认为空闲连接是由系统释放的,而不是用它们完成的?我还读到,由于它是一个游泳池,所以不好用 db.Close()
。
所以我有点困惑?我为解决连接问题所做的工作是否有效?或者有更好的方法吗?
非常感谢。
您只需要创建一个连接,return 同一个实例:
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
}