Gorm & Postgres Сброс соединения по пиру - PullRequest
0 голосов
/ 03 апреля 2020

Контекст

В настоящее время у меня есть 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
}

задача

Я отправляю более 500 000 запросов (INSERTS) на мою базу данных с 512 доступными соединениями, и через несколько минут в журнале postgres снова появляется следующая ошибка:

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

Любая помощь?

1 Ответ

0 голосов
/ 03 апреля 2020

Как вы используете 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
}

и посмотрите, решит ли это проблему.

...