@romaro

Почему Postgres не завершает IDLE-транзакции?

Работаю с Постгресом через низкоуровниевую библиотеку node-postgres, используя пул соединений.

Заметил, что под каждый запрос к БД открывается новая IDLE-транзакция, причем даже на одинаковые запросы:
623074c5e2690759955629.jpeg

Это быстро приводит к превышению числа максимальных подключений и постегрс перестает отвечать.

Вот как я создаю инстанс пула соединений:
const store = new StoreDB({
        user: 'dship',
        host: 'localhost',
        database: 'dship',
        password: '111',
        port: 5432,
        // Max of idle-transactions
        max: 20,
        idleTimeoutMillis: 1000,
        connectionTimeoutMillis: 500,
    })


Вот пример вызова:
export class StoreDB {
    constructor(config) {
        this.pool = new Pool(config);
        this.pool.on('error', (err, client) => {
            console.error('StoreDB Postgres error', err);
        })
    }

    async _query(sql) {
        try {
            const client = await this.pool.connect();
            return client.query(sql);
        } catch (e) {
            throw new Error(`StoreDB -> _query() ->`, e.message);
        }
    }
}


Может ли это быть связано с тем, что я вызываю функции/процедуры? Пример функции:
CREATE OR REPLACE FUNCTION helpdesk.tabof_active_issues(p_json json)
 RETURNS TABLE(t_id integer, t_creation_date timestamp with time zone, t_theme_title character varying, t_summary character varying, t_status_name character varying, t_status_color_code_hex character varying, t_status_update timestamp with time zone)
 LANGUAGE plpgsql
AS $function$
BEGIN
	RETURN QUERY SELECT
		i.id,
		i.creation_date,
		t.title,
		i.summary,
		s.title,
		s.color_code_hex,
		i.status_update_date
	FROM helpdesk.issue i
		JOIN helpdesk.issue_theme t
			ON	i.theme_id = t.id
		JOIN helpdesk.issue_status s
			ON i.status_id = s.id
	WHERE i.state = 1
		AND s.is_archived = 0
		AND i.user_id = (p_json ->> 'userKey')::integer
	ORDER BY i.creation_date;

	RETURN;
END;
$function$
;
  • Вопрос задан
  • 567 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
idle != idle in transaction. Это принципиально разные статусы.

Как вы сами написали, пул соединений у вас на приложении. Поэтому это именно к приложению вопрос, что вы делаете с библиотекой неверно, если на каждый запрос та пытается открывать новое соединение к базе, вместо использования свободного соединения из своего пула.

В частности, где вызов release()?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы