Golang. Как исправить ошибку "use of closed network connection"?

Разрабатываю api на языке golang используя фрэймворк gin. API сервер выдаёт информацию в виде JSON.

Запросы по http работают нормально. Но спустя пару запросов через ajax, я не могу больше брать информацию с сервера ни по url, ни через ajax.

Headers я так же указываю, как на сервере, так и на javascript.

Headers на api сервере:

r := gin.New()

r.Use(cors.New(cors.Config{
    AllowOrigins:     []string{"*"},
    AllowMethods:     []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"},
    AllowHeaders:     []string{"*"},
    ExposeHeaders:    []string{"*"},
    AllowCredentials: true,
    AllowOriginFunc: func(origin string) bool {
        return origin == "*"
    },
    MaxAge: 12 * time.Hour,
}))

API Сервер постоянно при запросе по url выдаёт данную ошибку:

read tcp 127.0.0.1:44188->127.0.0.1:5432: use of closed network connection
set tcp 127.0.0.1:44188: use of closed network connection

Логи контейнера:

2021-03-22 18:36:22.166 UTC [1] LOG:  starting PostgreSQL 13.1 (Debian 13.1-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
2021-03-22 18:36:22.166 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2021-03-22 18:36:22.166 UTC [1] LOG:  listening on IPv6 address "::", port 5432
2021-03-22 18:36:22.324 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2021-03-22 18:36:22.548 UTC [75] LOG:  database system was shut down at 2021-03-22 18:36:21 UTC
2021-03-22 18:36:22.628 UTC [1] LOG:  database system is ready to accept connections
2021-03-22 19:37:28.737 UTC [204] LOG:  could not receive data from client: Connection reset by peer
2021-03-22 19:37:50.508 UTC [205] LOG:  could not receive data from client: Connection reset by peer
2021-03-22 19:42:53.344 UTC [213] LOG:  could not receive data from client: Connection reset by peer
2021-03-22 20:06:24.316 UTC [218] LOG:  could not receive data from client: Connection reset by peer

Как исправить данную проблему?


Ответы (1 шт):

Автор решения: Senior Pomidor

все вызовы row.Scan() должны быть проверены на наличие ошибок.

я добавил ошибки и обнаружил сообщение conn is busy и после уже use of closed network connection. pgx.Connect() возвращает pgx.Conn который не может работать для параллельных запросов. Документация говорит.

Conn is a PostgreSQL connection handle. It is not safe for concurrent usage. Use a connection pool to manage access to multiple database connections from multiple goroutines.

поэтому заменяем pgx.Connect() на pgxpool.Connect() из github.com/jackc/pgx/pgxpool.

→ Ссылка