powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Асинхронный запрос
15 сообщений из 15, страница 1 из 1
Асинхронный запрос
    #39483131
Bazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Вопрос, как вызвать (например, из Java) pg-функцию (которая выполняется дооолго, например, час) и не ждать ее завершения?
Если вызвать pg-функцию и тупо разорвать соединение, не будет commit`a и функция не завершится...
...
Рейтинг: 0 / 0
Асинхронный запрос
    #39483150
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bazzzиз Java ... не ждатьjava.lang.Thread
...
Рейтинг: 0 / 0
Асинхронный запрос
    #39483153
Bazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
p2.Bazzzиз Java ... не ждатьjava.lang.Thread

Спасибо, но хочется чтобы Ява сказала Постгресу "работай" (делай апдейты/инсёрты/...) и забыла про Постгрес, а не создавала дополнительный поток (этих потоков может получиться оооочень много, да и ни к чему они, результат выполнения функции Яве не важен)!
...
Рейтинг: 0 / 0
Асинхронный запрос
    #39483261
Alex__kK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bazzz,

Запустить в джобе
...
Рейтинг: 0 / 0
Асинхронный запрос
    #39483266
Bazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex__kKBazzz,

Запустить в джобе

Идею с джобом отвергли сразу, фактически, он должен будет срабатывать каждую секунду!
...
Рейтинг: 0 / 0
Асинхронный запрос
    #39483269
Bazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex__kKBazzz,

Запустить в джобе

Идею с джобом отвергли сразу, фактически, он должен будет срабатывать каждую секунду!
Да, и инициатором должна быть Ява (это веб-сервис).
...
Рейтинг: 0 / 0
Асинхронный запрос
    #39483313
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bazzz,

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


dblink_send_query
https://www.postgresql.org/docs/current/static/contrib-dblink-is-busy.html
https://www.postgresql.org/docs/current/static/contrib-dblink-get-result.html


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

но, уж лучше писать всё в одном месте, нет ?
...
Рейтинг: 0 / 0
Асинхронный запрос
    #39483714
Bazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwqBazzz,

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


dblink_send_query
https://www.postgresql.org/docs/current/static/contrib-dblink-is-busy.html
https://www.postgresql.org/docs/current/static/contrib-dblink-get-result.html


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

но, уж лучше писать всё в одном месте, нет ?

Ухххх, спасибо Вам за совет, я почитал, попробовал, НО это не очень хороший подход потому, что:
1. присутствует гемор с вычитыванием ответов (хотя у меня получилось рвать коннект сразу после запуска запроса и вроде ОК).
2. не очень удобно вызывать функции базы, т.к. dblink_send_query заточен под получение результата типа record.
3. dblink кэширует все коннекты и запросы на своей стороне, а значит, его использование это то же самое, что делать на стороне Явы несколько потоков.
3. фактически, асинхрон в dblink создает на каждый запрос ФИЗИЧЕСКИЙ коннект к базе (которых в Pg1.5 по умолчанию всего 100). Ну а то, что самые долгие операции в высоконагруженной системе (в которой пользователи вызывают сотни-тысячи запросов в секунду) это коннекты - все знают. Так что не стоит использовать этот функционал для взаимодействия с базой со стороны веб-сервисов!

У меня задача, вызвав функцию базы из Ява-приложения, закрыть транзакцию и не отменить этим выполнение только что вызванной функции!

В любом случае, огромное спасибо qwwq за совет, хороший опыт!!!
...
Рейтинг: 0 / 0
Асинхронный запрос
    #39483768
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bazzz3. фактически, асинхрон в dblink создает на каждый запрос ФИЗИЧЕСКИЙ коннект к базе (которых в Pg1.5 по умолчанию всего 100). Ну а то, что самые долгие операции в высоконагруженной системе (в которой пользователи вызывают сотни-тысячи запросов в секунду) это коннекты - все знают. Так что не стоит использовать этот функционал для взаимодействия с базой со стороны веб-сервисов!ваше блаблабла неверно. если вы откроете в вашем единственном контрольном соединении жабы несколько ИМЕНОВАННЫХ коннектов дблинка, и не будете их сами закрывать, у вас будет (в вашем контролирующем соединении) пул постоянно открытых дблинк--соединений. Конечно вам придется постоянно опрашивать их на из_бизи , и при освобождении -- еще и аккуратно гет_резалтить. Но т.к. вам результаты не нужны, все вызовы вы можете оформит как returns void хранимки, и геттенье будет однотипным. и всё -- через одно контролирующее соединение жабы, без долгих вызовов и ожиданий.


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

BazzzУ меня задача, вызвав функцию базы из Ява-приложения, закрыть транзакцию и не отменить этим выполнение только что вызванной функции! вы , вызвав любой из асинхронных методов дблинка, закрываете транзакцию "контролирующего соединения", "закрыть" исполняемую (в соединении==процессе, открытом дблинк-ом) транзакцию вы не можете, она еще не закончена.
...
Рейтинг: 0 / 0
Асинхронный запрос
    #39483822
Bazzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwqваше блаблабла неверно. если вы откроете в вашем единственном контрольном соединении жабы несколько ИМЕНОВАННЫХ коннектов дблинка, и не будете их сами закрывать, у вас будет (в вашем контролирующем соединении) пул постоянно открытых дблинк--соединений.
Про то и речь.
Код: plsql
1.
select * from pg_stat_activity;

подтвердит.

Вы согласны, что на веб-сервис могут постучаться больше 100 пользователей одновременно?
Вы согласны, что на каждый стук пользователя придется вызывать
Код: plsql
1.
select dblink_connect('dblink_conn', 'dblink_server');

? Ведь функция базы выполняется долго.

Ну, а теперь, просто вызовите
Код: plsql
1.
select dblink_connect(i::text, 'dblink_server') from generate_series(1,200) as i;

и при стандартных настройка pg вылетит ошибка
Код: plsql
1.
2.
ERROR:  could not establish connection
DETAIL:  FATAL:  sorry, too many clients already



qwwqоформит как returns void хранимки, и геттенье будет однотипным.
Странно, но при попытке получить результат вызванное функции с результатом типа void
типа
Код: plsql
1.
select dblink_get_result('xxx');


получаю
Код: plsql
1.
ERROR:  function returning record called in context that cannot accept type record



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

qwwqтранзакцию вы не можете, она еще не закончена.
Конечно не могу, плохо выразился.

Попробую еще раз переформулировать:
я хотел бы получив обращение пользователя на веб-сервис Явы, кинуть notify Постгресу о том, что надо начать такую-то большую обработку, и забыть про Постгрес до следующего обращения пользователя.
...
Рейтинг: 0 / 0
Асинхронный запрос
    #39483850
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BazzzПопробую еще раз переформулировать:
я хотел бы получив обращение пользователя на веб-сервис Явы, кинуть notify Постгресу о том, что надо начать такую-то большую обработку, и забыть про Постгрес до следующего обращения пользователя.

Это задача приложения и ваша головная боль. И никак не является задачей базы.

--
Maxim Boguk
dataegret.ru
...
Рейтинг: 0 / 0
Асинхронный запрос
    #39483872
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> я хотел бы получив обращение пользователя на веб-сервис Явы, кинуть notify Постгресу о том, что надо начать такую-то большую обработку, и забыть про Постгрес до следующего обращения пользователя.

вам может помочь очередь. если нужна "транзакционная" -- посмотрите на pgq фрейморк
...
Рейтинг: 0 / 0
Асинхронный запрос
    #39483915
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bazzzqwwqваше блаблабла неверно. если вы откроете в вашем единственном контрольном соединении жабы несколько ИМЕНОВАННЫХ коннектов дблинка, и не будете их сами закрывать, у вас будет (в вашем контролирующем соединении) пул постоянно открытых дблинк--соединений.
Про то и речь.
Код: plsql
1.
select * from pg_stat_activity;

подтвердит.

Вы согласны, что на веб-сервис могут постучаться больше 100 пользователей одновременно?

ачотакова ?
BazzzВы согласны, что на каждый стук пользователя придется вызывать
Код: plsql
1.
select dblink_connect('dblink_conn', 'dblink_server');

?
нет, конечно

у вас есть ограничение на 100 соединений== 100 процессов постгреса == 100 процессов , в которых выполняются "функции, которые долго". вне этих процессов постгреса==соединений они ["функции, которые долго"] выполнятся НЕ могут,


откуда мораль -- открываете 100 соединений в пуле, и запросы СВЕРХ этих 100 ставите в очередь . как её кодить -- дело ваше. хотите в жабском пуле. хотите -- в пуле соединений дблинка. но потерь на открытие новых соединений у вас не будет (только при падении ранее поднятых, если вы пул напишете правильно, с переподнятием покойников).

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


Bazzzqwwqоформит как returns void хранимки, и геттенье будет однотипным.
Странно ?????, но при попытке получить результат вызванное функции с результатом типа void
типа
Код: plsql
1.
2.
3.
4.
select *  FROM dblink_get_result('xxx') 
AS t (f text);
-- ф-я возвращает рекорд, [содержащий поле с типом void]
-- оформите наконец вызов соответственно типу возврата



BazzzНе то, что не хочу, сейчас так и делается, но этих потоков многооооо и они в статусе wait вместо того, что занимать полезной нагрузкой...

они и занимаются полезной нагрузкой -- ожидают освобождения процесса поцгресса, занятого транзакцией. В противном случае вам пришлось бы организовывать опрос освобождения соединений руками, в цыкле, как в случае с дблинковым пулом и асинхронными вызовами (если вы до этого дошли).
...
Рейтинг: 0 / 0
Асинхронный запрос
    #39484222
Alex__kK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

а если прикрутить еще pgbouncer к dblink, то dblink работать будет еще быстрее, поскольку устраняется оверхед на установление соединений, я где-то даже презентацию подобного видел людей из постгрес про, где они приводят эти цифры.
...
Рейтинг: 0 / 0
Асинхронный запрос
    #39484234
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex__kKqwwq,

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


и ещё я немного люблю препареды -- для них пг_баунсеры не подходят, навскидку. нужен пул с одинакими именованными препаредами, как св-вами соединений. хотя если ,кроме моей приблуды, никто данного пула баунсера не делит -- кажеццо вытанцуется,
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Асинхронный запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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