Как сделать несколько запросов за очень короткий промежуток времени / одновременно - PullRequest
0 голосов
/ 28 октября 2019

Привет, я получаю сообщение об ошибке: conn busy от pgx

Я не знаю, как решить эту проблему. Вот моя функция:

func (r *proverbRepo) SelectPendingProverbs(table string) (proverbs []domain.Proverb, err error) {
    query := fmt.Sprintf("SELECT id, proverb literal FROM %s", table)
    rows, err := r.Db.Query(context.Background(), query)
    defer rows.Close()

    if err != nil {
        return
    }

    for rows.Next() {
        var prov domain.Proverb
        if err = rows.Scan(&prov.ID, &prov.Literal); err != nil {
            return
        }
        proverbs = append(proverbs, prov)
    }
    return
}

r.Db - это pgx.Connect(context.Background(), os.Getenv("PSQL_URL"))

Я получаю две разные таблицы за очень короткий промежуток времени из двух отдельных запросов переднего плана.

Первый запрос проходит, другой возвращает сообщение об ошибке conn busy.

Я действительно не знаю, что искать, кто-нибудь мне поможет?

1 Ответ

2 голосов
/ 29 октября 2019

pgx.Connect() возвращает pgx.Conn, который нельзя использовать одновременно. Вот что означает godocs этого типа:

Conn - дескриптор соединения PostgreSQL. Это не безопасно для одновременного использования. Используйте пул соединений для управления доступом к нескольким соединениям с базой данных из нескольких подпрограмм.

Так что если вы замените pgx.Connect() на pgxpool.Connect() с github.com/jackc/pgx/pgxpool, то все будет в порядке.

...