akalend
@akalend
программирую

Как правильно построить Event-driven architecture на Libev для выполнения SQL запросов (libmysqllient)?

По результатам темы habrahabr.ru/post/144918/, которая есть перевод «Async MySQL Queries with C-API» September 09, 2008 jan.kneschke.de/2008/9/9/async-mysql-queries-with-c-api/,


Собственно тот пост есть сферический конь в вакууме… так как в реальной жизни, нам не нужно сразу параллельно запускать несколько SQL запросов из одной точки программы.

Реальность нам диктует, что нужно использовать возможность асинхронности их выполнения из разных циклов обработчика события, например при написании демонов на libevent/libev.


Так вот, ближе к телу делу: есть код асинхронного выполнения SQL запросов на libev pastebin.ru/nzhiAsEw (код рабочий, результаты выполнения habrahabr.ru/post/144918/#comment_5808481)


все просто и ясно при выполнении в функции обработчике одного запроса:

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


— При наступлении определенного события определяется

— callback обработки SQL sql_read_cb (EV_P_ ev_io *w, int revents)

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

— выполняется запрос на этом файловом дескрипторе mysql_send_query();


— При получении отвера от MySQL сервера (событие EV_READ) выполняется callback sql_read_cb() в котором определен обработчик SQL запроса sql_p1_cb(....), где происходит обработка ответа… Если это сетевое соединение, то результатом может быть отправка данных в сокет соединения. В данном примере просто printf().


Однако, как правильно организовать архитектуру, если мы должны выполнить несколько последовательных SQL запросов в цикле обработчика события, причем каждый последующий запрос зависит от результатов выполнения предыдущего (или запроса например может и не быть, так как данные были уже получены ранее)…
  • Вопрос задан
  • 4024 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы