LINUX.ORG.RU

Неблокирующие запросы к БД

 , , ,


0

1

Подскажите пожалуйста, есть ли способ делать неблокирующий execute в perl DBI?

пример:

my $sth=$dbh->prepare("select 99,pg_sleep(2)");#некий длительный запрос
$sth->execute;#в этом месте ждём выполнения запроса
while(@_=$sth->fetchrow_array){
	say @_;
}

Хочется что то вроде такого:

my $sth=$dbh->prepare("select 99,pg_sleep(2)");
$sth->execute_async;#отпраляем запрос и возвращаем управление
#Делаем тут что то полезное ресурсоемкое, а БД в то же время формирует результат
while(@_=$sth->fetchrow_array){#а вот тут уже ждем, если результат еще не готов
	say @_;
}

★★★

Ответ на: комментарий от helios

The overhead for very simple statements («select 0») is somewhere around 100% to 120% (dual/single core CPU) compared to an explicit prepare_cached/execute/fetchrow_arrayref/finish combination.

ЕМНИП AnyEvent::DBI использует форки процесса для слежения за статусом запроса, меня настораживает что кроме моих нескольких процессов fastcgi появится еще столько же (как минимум).

disarmer ★★★
() автор топика
Ответ на: комментарий от disarmer

AnyEvent::DBI использует форки процесса для слежения за статусом запроса

ЕМНИП, зависит от EV методов.

joy4eg ★★★★★
()

Я вообще не уверен сколько драйверов БД поддерживают коллбеки. А держать тред, во-первых делается ручками очень просто, а во-вторых просто не комильфо

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)

Только для mysql: http://search.cpan.org/perldoc?Coro::Mysql

Вообще, DBI (и все сопутствующее) проектировались под модель форков, поэтому используй AnyEvent::DBI или огребешь много попоболи :)

gh0stwizard ★★★★★
()

Только некоторые драйвера умеют асинхронные запросы. В частности mysql и postgre умеют, посмотреть можно в их документации

Olegymous ★★★
()

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

outtaspace ★★★
()
Ответ на: комментарий от disarmer

Нет. Триггер на таблицу в которой хранятся параметры выполняемых задач (аргументы функций). Реализация через pub/sub сразу дает мгого разных вариантов решения вашей проблемы.

outtaspace ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.