Gorm & Postgres 连接由对等方重置



上下文

目前我有一个REST API,它管理数据库中的客户数据。我正在使用以下堆栈:

  • Go 1.13

  • github.com/jinzhu/gorm v1.9.1

  • Postgres 11

我有以下连接设置。

// NewConnection ...
func NewConnection() (*gorm.DB, error) {
config := getConfig()
connStr := "host=xx.xx.xx port=5432 user=chavista-hatter dbname=my-db password=abc sslmode=verify-ca sslrootcert=/path/to/rcert sslcert=/path/to/cert sslkey=/path/to/key connect_timeout=0"
db, err := gorm.Open("postgres", conn)
if err != nil {
return nil, err
}
db.DB().SetMaxOpenConns(25)
db.DB().SetMaxIdleConns(25)
db.DB().SetConnMaxLifetime(5 * time.Minute)
db.SingularTable(true)
if config.LogQueries {
db = db.Debug()
}
return db, nil
}

我在主类中获得一个连接,并将该连接注入到通过Gorm(ORM(执行查询的存储库类中

主类

db, err := database.NewConnection()
if err != nil {
panic(fmt.Sprintf("failed to connect database --> %v", err))
}
fmt.Println("database connection established successfully")
defer db.Close()
customerRepo := customer.NewRepository(db)

存储库类

type repository struct {
db *gorm.DB
}
//NewRepository 
func NewRepository(db *gorm.DB) Repository {
return &repository{
db: db,
}
}
func (r *repository) Register(customer *models.Customer) (string, error) {
err := r.db.Create(&customer).Error
if err != nil {
return "", err
}
return customer.key, nil
}

问题

我向我的数据库发送了超过500k的请求(INSERTS(,该数据库有512个可用连接,几分钟后,postgres日志中开始重复出现以下错误:

unexpected EOF on client connection with an open transaction 
could not receive data from client: Connection reset by peer

有什么帮助吗?

对于测试容器,添加以下内容:

wait.ForListeningPort("5432/tcp")

如何在代码中使用GetConnection?它在每次调用时都会创建一个新的连接池——理想情况下,你只想调用一次,并将单个连接传递到使用它的任何地方。

我会尝试将其更改为:

var db *gorm.DB
func NewConnection() (*gorm.DB, error) {
if db != nil {
return db, nil
}
config := getConfig()
connStr := "host=xx.xx.xx port=5432 user=chavista-hatter dbname=my-db password=abc sslmode=verify-ca sslrootcert=/path/to/rcert sslcert=/path/to/cert sslkey=/path/to/key connect_timeout=0"
var err error
db, err = gorm.Open("postgres", conn)
if err != nil {
return nil, err
}
db.DB().SetMaxOpenConns(25)
db.DB().SetMaxIdleConns(25)
db.DB().SetConnMaxLifetime(5 * time.Minute)
db.SingularTable(true)
if config.LogQueries {
db = db.Debug()
}
return db, nil
}

看看它是否能解决问题。

相关内容

  • 没有找到相关文章

最新更新