Неблокирующая обработка ассинхронных запросов к MySQL
От: shestero  
Дата: 02.02.16 01:29
Оценка:
Вопрос возник в связи с web-порграммированием: http://rsdn.ru/forum/web/6319626.1
Автор: shestero
Дата: 21.01.16

Погуглив тему, я пришёл к выводу что на PHP такое сделать скорее всего не возможо, так как вообще соответствующий функционал нашёл только для C только в libmariadbclient (которую как я понял, можно применить и с MySQL):
https://mariadb.com/kb/en/mariadb/using-the-non-blocking-library/#setting-mysql_opt_nonblock
https://github.com/ottok/mariadb-10.0/blob/master/client/async_example.c
Эта библиотека в свою очередь может быть применена в Node.js:
https://www.npmjs.com/package/mariasql

А больше я ничего не нашёл! Хотелось бы, например, хоть какую-то готовую обёртку на C++.

Правильно ли я понял, что JDBC в принципе не поддерживает ассинхронную неблокирующую обработку?
Для Java и Scala нашёл только вот что:
https://github.com/scalikejdbc/scalikejdbc-async
— выглядит каким-то очень "сырым", не понял, есть ли там неблокирующие функции вообще.
К тому же я подозреваю, что по-сути эта библиотека внутри просто использует свои потоки и отдельные простые буферизированные обращения к СУБД, т.е. асинхронность тут не доходит до уровня СУБД.
Отредактировано 02.02.2016 1:30 shestero . Предыдущая версия .
Re: Неблокирующая обработка ассинхронных запросов к MySQL
От: MasterZiv СССР  
Дата: 04.02.16 07:07
Оценка:
Здравствуйте, shestero, Вы писали:

S>... ассинхронную неблокирующую обработку?


Расскажи, пожалуйста, что ты под этим понимаешь ...
Re[2]: Неблокирующая обработка ассинхронных запросов к MySQL
От: shestero  
Дата: 05.02.16 06:25
Оценка:
S>>... ассинхронную неблокирующую обработку?
MZ>Расскажи, пожалуйста, что ты под этим понимаешь ...

1. Асинхронная обработка — это значит возможность отправить запрос в СУБД и пока он там выполняется продолжить другие операции в потоке программы не останавливая её до полной отработки задания в СУБД.
В PHP, например, и возможно других языках такие запросы называются "unbuffered". По одному открытому соединению с СУБД можно одновременно выполнять только один такой запорс (хотя ничего не мешает сделать много соединений).

2. Неблокирующая обработка обозначает возможность проверить состояние запроса — готовы ли данные для извлечения из СУБД либо такую операцию чтения, которая завершаяется немеденно, без ожидания, даже если данные ещё не готовы (вернув, например, 0).
В современном PHP, например, для этого предусмотрена функция mysqli_poll.

Однако если результат выполнения запроса не одна, а много записей, они из СУБД приходят по одной — с некоторой задержкой межуд друг другом. В случае PHP при unbuffered-чтении в цикле будет порисходить отдеьлная блокировка в операци при получении каждой записи. Функции проверки готовности записей выборки в интерфейсах PHP я не нашёл.
Мне же нужно, что бы блокировки тут не было. Что бы функция возвращала 0 немедленно, если пока нет готовых записей либо ожидала заданный аргументами тайм-аут, как select для сигналов в Unix-е или как mysqli_poll.
Важно ещё учесть, что несколько записей могут оказаться готовыми одновременно. Либо после очередной временной задержки СУБД может выдать "EOF", т.е. нет больше записей, запрос отработал.

Мне удалось объяснить, что мне нужно?

Резюмирую: нужна такая функция извлечения записей из СУБД которая без задержки выдаёт один из следующих результатов:
1. записи ещё не готовы ("ждите")
2.1 готово N записей, записи ещё могут быть
2.2 готово N записей, записей больше не будет
3. записей больше не будет (запрос отработал успешно)
4. ошибка


PS Вопосы касающиейся имено языка PHP: Из описания mysqli_poll мне не ясно просигнализирует ли она о готовности первой готовой записи результата или всего запроса. Подозреваю что второй вариант. Если же первый — то можно ли и как правильно повторно вызвать mysqli_poll на том же запросе для следующих записей? и что если при первом срабатывании mysqli_poll была на самом деле готова не одна, а сразу несколько записей? что если после чтения первых записей СУБД определила, что записей больше не будет (запрос выполнен)? .
Re[3]: Неблокирующая обработка ассинхронных запросов к MySQL
От: paucity  
Дата: 05.02.16 20:55
Оценка:
Здравствуйте, shestero, Вы писали:

S>1. Асинхронная обработка — это значит возможность отправить запрос в СУБД и пока он там выполняется продолжить другие операции в потоке программы не останавливая её до полной отработки задания в СУБД.


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

тебе или в "веб программирование" или лучше вообще на php-форум какой.
Re[4]: Неблокирующая обработка ассинхронных запросов к MySQL
От: shestero  
Дата: 06.02.16 13:10
Оценка:
S>>1. Асинхронная обработка — это значит возможность отправить запрос в СУБД и пока он там выполняется продолжить другие операции в потоке программы не останавливая её до полной отработки задания в СУБД.
P>чтот мне подсказывает, что ты не тот раздел выбрал для вопроса.
P>тебе или в "веб программирование" или лучше вообще на php-форум какой.

Нет, я хочу ответ вопрос не применительно к web, а PHP упомянул только для примера.
То что нужной мне функциональности нет на PHP я почти уверен.
Меня интересует сейчас в первую очередь C++, во вторую — Java и Scala.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.