Работаю с Постгресом через низкоуровниевую библиотеку node-postgres, используя
пул соединений.
Заметил, что под каждый запрос к БД открывается новая IDLE-транзакция, причем даже на одинаковые запросы:
Это быстро приводит к превышению числа максимальных подключений и постегрс перестает отвечать.
Вот как я создаю инстанс пула соединений:
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$
;