postgresql Gorm & Postgres连接被对等体重置

cetgtptt  于 2023-05-17  发布在  PostgreSQL
关注(0)|答案(2)|浏览(140)

上下文

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

  • 去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

有什么帮助吗?

ru9i0ody

ru9i0ody1#

如何在代码中使用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
}

看看能不能解决问题

amrnrhlw

amrnrhlw2#

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

wait.ForListeningPort("5432/tcp")

相关问题