powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Где храниться идентификатор, возвращаемый pg_backend_pid()
17 сообщений из 17, страница 1 из 1
Где храниться идентификатор, возвращаемый pg_backend_pid()
    #39020264
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Идентификатор сессии в postgres'е возвращается функцией pg_backend_pid(). Мне нужно отловить момент, когда сессия закрывается.
Если, скажем, идентификатор хранится в системной таблице, то я бы повесил на системную таблицу триггер: при удалении (высвобождении) идентификатора (когда сессия закроется), триггер вызывал бы мне определенную plpgsql функцию.
Если он нигде не хранится, то, может быть, есть какая-нибудь функция, процедура, срабатывающая при закрытии сессии. Тогда интересно какая.
Спасибо за ответы
...
Рейтинг: 0 / 0
Где храниться идентификатор, возвращаемый pg_backend_pid()
    #39020358
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContra,

если через pgbouncer работать в session режиме, можно server_reset_query прописать.
на системные каталоги триггеры вроде бы навешивать нельзя, даже если там где-то и хранятся pid'ы backend'ов.
возможно еще в каких-то экстеншнах такая функция (можно погуглить по on disconnect trigger) есть, но я не нашел.

а что вы хотите при закрытии сессии делать?
...
Рейтинг: 0 / 0
Где храниться идентификатор, возвращаемый pg_backend_pid()
    #39020457
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexiusPCContra,

если через pgbouncer работать в session режиме, можно server_reset_query прописать.
на системные каталоги триггеры вроде бы навешивать нельзя, даже если там где-то и хранятся pid'ы backend'ов.
возможно еще в каких-то экстеншнах такая функция (можно погуглить по on disconnect trigger) есть, но я не нашел.

а что вы хотите при закрытии сессии делать?
Мне надо взять этот идентификатор сессии и удалить его из своей таблицы, в котором он присутствует
Код: sql
1.
DELETE FROM logs.pidlist WHERE pid=2035;--Если закрылась сессия с pg_backend_pid() = 2035
...
Рейтинг: 0 / 0
Где храниться идентификатор, возвращаемый pg_backend_pid()
    #39020476
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContra,

если вам требуется синхронность -- вы попали.
во всех смыслах

например потому что вы не можете откатить событие кладки бекенда, если у вас далее выскочит ошибка в обработчике этого события

следовательно -- асинхронность -- единственное, на что вы можете рассчитывать

а это просто периодическое чтение из вьюхи pg_stat_activity -- там все ваши живые пиды валяются.

периодическое чтение -- и обработка. воркер любой -- хоть крон, хоть pg_agent , хоть что-то своё.
...
Рейтинг: 0 / 0
Где храниться идентификатор, возвращаемый pg_backend_pid()
    #39020495
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContra,

в качестве идентификатора сессии лучше использовать что-то такое (pid + backend_start_time):
Код: sql
1.
2.
SELECT to_hex(EXTRACT(EPOCH FROM backend_start)::integer) || '.' || to_hex(pid) 
FROM pg_stat_activity where pid = pg_backend_pid();



и тогда сессии наверное можно будет удалять периодически (по крону, например).
...
Рейтинг: 0 / 0
Где храниться идентификатор, возвращаемый pg_backend_pid()
    #39020520
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqPCContra,

если вам требуется синхронность -- вы попали.
во всех смыслах

например потому что вы не можете откатить событие кладки бекенда, если у вас далее выскочит ошибка в обработчике этого события

можно, пожалуйста, тут поподробнее?

авторследовательно -- асинхронность -- единственное, на что вы можете рассчитывать

а это просто периодическое чтение из вьюхи pg_stat_activity -- там все ваши живые пиды валяются.

периодическое чтение -- и обработка. воркер любой -- хоть крон, хоть pg_agent , хоть что-то своё.
Это пойдет, в принципе. Удалять из logs.pidlist те pid'ы, которых нет во вьюхе pg_stat_activity . Интересно будет протестировать вот такое построение логов ради логина юзера из внешнего приложения (ибо от current_user я отказался по своим соображениям):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE FUNCTION my_func() RETURNS trigger AS $$
  BEGIN
    DELETE FROM logs.pidlist WHERE pid=pg_backend_pid() OR (pnum=NEW.pnum AND pid<> ANY (SELECT pid FROM pg_stat_activity))
    RETURN NEW;
  END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER log BEFORE INSERT ON logs.pidlist
FOR EACH ROW EXECUTE PROCEDURE my_func();


Код: php
1.
2.
3.
$db = new PDO('pgsql:host=192.168.137.1;port=5432;dbname=anydb', 'anyuser', 'pass');
$user = 13;
$db->query("INSERT INTO logs.pidlist(pid, pnum) SELECT pg_backend_pid(), $user;");



надо будет протестировать, скажем, на 100 одновременных коннектов
Кстати, как это можно сделать?
...
Рейтинг: 0 / 0
Где храниться идентификатор, возвращаемый pg_backend_pid()
    #39020556
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContraа что вы хотите при закрытии сессии делать?
Мне надо взять этот идентификатор сессии и удалить его из своей таблицы, в котором он присутствует
Код: sql
1.
DELETE FROM logs.pidlist WHERE pid=2035;--Если закрылась сессия с pg_backend_pid() = 2035

[/quot]а из таблицы зачем удалять? ну и так далее... в общем сразу к бизнес-сути, чтобы не тянуть кота за орган на букву х.
...
Рейтинг: 0 / 0
Где храниться идентификатор, возвращаемый pg_backend_pid()
    #39020598
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.,

не мешайте товарищу контре. у него свои тараканы -- биться с ними бесполезно.
предлагали неоднократно заюзать переменные сессии -- раз они, сессии, у него не пуллятся. -- не хочет.


контра, возьмите поле backend_start из pg_stat_activity в вашу таблицу логирования подключений. как есть, без всяких преобразований -- и будет вам щастье -- сможете делетить даже протухшие пиды, которые опять вернулись в активити. И никакого джоба не надо -- надо проверять актуальность по совпадению backend_start .

я, кстати, не понимаю , зачем вам вообще вести такую таблицу -- забираете pid при установке соединения на клиента -- и оттуда шлете во все WHERE "AND backend_pid()= $1".

но это всё левак -- т.к. не приложение, написанное так -- не пуллится в принципе.
...
Рейтинг: 0 / 0
Где храниться идентификатор, возвращаемый pg_backend_pid()
    #39020606
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqпредлагали неоднократно заюзать переменные сессииесли для переменных, то зачем их удалять. ну разве что ос имеет большее чем традиционно-юниксовые 16 бит на номер процесса. но и тогда удалять лишнее можно при инициации
...
Рейтинг: 0 / 0
Где храниться идентификатор, возвращаемый pg_backend_pid()
    #39020624
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.qwwqпредлагали неоднократно заюзать переменные сессииесли для переменных, то зачем их удалять. ну разве что ос имеет большее чем традиционно-юниксовые 16 бит на номер процесса. но и тогда удалять лишнее можно при инициации
"PCContra"
последние 3 темы -- и поймёте ход мыслей ТС-а.

в частности к вашему "зачем" -- он уже практически пришел в 17960584.
...
Рейтинг: 0 / 0
Где храниться идентификатор, возвращаемый pg_backend_pid()
    #39021010
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqp2.,

не мешайте товарищу контре. у него свои тараканы -- биться с ними бесполезно.
предлагали неоднократно заюзать переменные сессии -- раз они, сессии, у него не пуллятся. -- не хочет.


контра, возьмите поле backend_start из pg_stat_activity в вашу таблицу логирования подключений. как есть, без всяких преобразований -- и будет вам щастье -- сможете делетить даже протухшие пиды, которые опять вернулись в активити. И никакого джоба не надо -- надо проверять актуальность по совпадению backend_start .

я, кстати, не понимаю , зачем вам вообще вести такую таблицу -- забираете pid при установке соединения на клиента -- и оттуда шлете во все WHERE "AND backend_pid()= $1".

но это всё левак -- т.к. не приложение, написанное так -- не пуллится в принципе.
Что такое "пуллится" ?
"зачем вам вообще вести такую таблицу" - ну мне надо pnum (или username, по-вашему), а как я этот pnum возьму? Есть, скажем, таблица, в которой нет поля для юзера. И стоит задача делать логи такой таблицы. Единственно доступная мне хоть какая-то переменная сессии - это pid, а нужно - pnum. Поэтому это - таблица связи.
Существуют и другие способы логов. Я вижу 3 варианта:
1) Добавить поле pnum в каждую таблицу ( а также всякие доп поля, типа ip адрес, время изменения, и другую мелочь). Мне в напряг так делать, т.к. это не нужные для бизнес-процесса поля, которые занимают доп место, еще и при LEFT JOIN и других запросах надо смотреть, чтобы они не приводили к ошибкам, типа неоднозначности. Запросы могут тормозить на моем железе - для меня это главное, поэтому даже эксериментировать я не буду
2) Добавить в каждый запрос вставки/изменения/удаления поле pnum, а в триггере возвращать NEW.* только без поля pnum. Хорошая идея, но, опаньки, откуда взять для удаления NEW? Удаление в лог не попадет. Поэтому этот вариант отпадает . Да и в каждый запрос неудобно добавлять внешнюю переменную pnum. Хочу на автомате.
3) Создать множество ролей в самой БД. Не для меня, под существующие бизнес-процесыы - это не подходит.
Вариант либо с такой таблицей, либо с пременными сессии. Оба подойдут
...
Рейтинг: 0 / 0
Где храниться идентификатор, возвращаемый pg_backend_pid()
    #39021021
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContra,

1. пуллится -- обслуживается пуллером соединений

когда и зачем -- много соображений, но в том числе потому, что поднятие соединения -- дорого. много простаивающих соединений -- дорого (они держат память, и , хотя бы по минимумув -- семафоры там разные -- немного процессорных ресурсов. Ну и сама техника развода транзакций и всяких там общих ресурсов по процессам наверняка долхна зависеть от числа процессов N и видимо -- хуже чем O(N).

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

в режиме пула обычно соединение не закреплено за каким--то клиентом (хотя я например для спец задач делаю пул "на соединение"-- но там задача в соединении прослать не одну ,а пакет транзакций в автомате , ответ первой из которых используется в следующей -- и они никого не ждут -- все данные известны на входе. -- отдавать соединение после захвата до конца пакета нет смысла. )

как правило пулер создаёт пул [набор соединений] под (хост,юзера (БД),БД) -- и при передаче его другому запросившему клиенту (с той же ролью==юзером) на автомате выдает discard all; -- сбрасывает переменные сеанса. Поэтому работать с ним удобно через хранимки, в которые передаётся параметром "реальнй юзер", или даже его сеанс (тот или иной способ id-кации) -- а параметры сеанса, если требуется "распределённая" а не транзакционная обработка работы юзера -- пишутся в БД.

работа напрямую с таблицами -- как-то не очень оправдана вообще, если это не текст хранимки, ящетаю.

Поэтому вот это ваше определение пользователя через pid соединения -- паллиатив, не решающий реальных проблем. Уйдите от прямой работы с таблицами. В каждую хранимку добавьте параметр -- гуид сеанса, который вычисляйте клиентом -- и не будете зависеть от режимов работы -- хотите -- транзакционный пуллинг. хотите -- оставайтесь на сессионном.
...
Рейтинг: 0 / 0
Где храниться идентификатор, возвращаемый pg_backend_pid()
    #39021033
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,
в мануале есть на эту тему? Жесть какая-то
...
Рейтинг: 0 / 0
Где храниться идентификатор, возвращаемый pg_backend_pid()
    #39021044
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContraqwwq,
в мануале есть на эту тему? Жесть какая-то
в каком мануале ? по пыхе?

это вобще-то стандартные паттерны работы с БД.
наверняка есть и кукбуки для пыхи
или вот на хабре нубы любят написать что-то типа "я и пг-баунсер"
или "я и пул соединений"
т.ч. - ищите в интернетах про работу например из пыхи с pg_bouncer .
https://yandex.ru/search/?text=pg_bouncer php&lr=213&clid=2186618
я то саму пыху только для пробы дергал -- пару страничек писал -- подключение к бд, и отрисовку произвольного грида. т.ч. про паттерны для пыхи ничего не скажу.
...
Рейтинг: 0 / 0
Где храниться идентификатор, возвращаемый pg_backend_pid()
    #39021096
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContraqwwq,
в мануале есть на эту тему? Жесть какая-то

На какую тему?
Стандартная рекомендация - количество процессов базы не больше чем 2xчисло ядер доступных на сервере.
У версий до 9.4 начинается потеря производительности начиная от 32 коннектов и выше (очень заметная на 64).
На 9.4 - при 64 и далее (заметная после 128).

Поэтому пока ваша система рассчитана на работу не более чем скажем 50 человек одновременно (50 установленных коннектов к базе) - ваши подходы как-то приемлемы... если на 200+ - ваш подход не рабочий что с ним не делай (будет уже медленно и дорого по ресурсам. Поэтому все системы рассчитанные на массовое обслуживание строятся с использованием connection pooling (pgbouncer).

В принципе просто 100 idle коннектов это не особо страшно пока они все сразу не попробуют начать транзакции, но вот если у вас будет 1000 idle коннектов - у вас начнутся проблемы 100%.
https://wiki.postgresql.org/wiki/Number_Of_Database_Connections

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Где храниться идентификатор, возвращаемый pg_backend_pid()
    #39021425
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот самый последний пост на этот вопрос (который вылезает каждый месяц в рассылке если не часто).
От ведущего и главного разработчика:
"
> So the question is: do idle connections impact performance?

Yes. Those connections have to be examined when gathering snapshot
information, since you don't know that they're idle until you look.
So the cost of taking a snapshot is proportional to the total number
of connections, even when most are idle. This sort of situation
is known to aggravate contention for the ProcArrayLock, which is a
performance bottleneck if you've got lots of CPUs.

You'd be a lot better off with a pooler.

(There has been, and continues to be, interest in getting rid of this
bottleneck ... but it's a problem in all existing Postgres versions.)

regards, tom lane
"

Поэтому ваше решение оно не масштабируемо в принципе по железу вверх (что вы с ним не делайте).

PS: кстати... есть интересная идея как вообще вашу проблему решить и поддержку connection pooling оставить и ORM на хранимки не переделывать.
Все что надо это добавить в ваш ORM короткий кусок кода который бы после текста запроса ставил бы что то вида
--USER: username
--IP: ip
и так далее всю информацию необходимую для аудита.
А дальше триггера (разбор current query регулярными выражениями конечно криво но в принципе это наименее кривое решение из всех вариантов которые у вас обсуждались не требующее смены логики работы кода и структуры базы). Более того в триггере можно запретить выполнение запросов у которых нет audit комментариев.
Я подобные вещи ставил в кучу ORM для java/php/perl/pytnon (впрочем для другой задачи но похожей - писать в лог базы URL с которого вызвался запрос для быстрого поиска источника проблемных запросов).

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Где храниться идентификатор, возвращаемый pg_backend_pid()
    #39021793
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqпредлагали неоднократно заюзать переменные сессии -- раз они, сессии, у него не пуллятся. -- не хочет.
Может и пуллятся, я как-то не заморачивался.

Maxim BogukПоэтому все системы рассчитанные на массовое обслуживание строятся с использованием connection pooling (pgbouncer).
У меня, наверное, меньше. Пока не стало больше - почитаю про pgbouncer пока есть время
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Где храниться идентификатор, возвращаемый pg_backend_pid()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]