В MySQLCommand BeginExecuteReader отсутствует параметр AsyncCallback, что делает его практически бесполезным - PullRequest
1 голос
/ 18 сентября 2009

Я надеюсь, что кто-то здесь может мне помочь.

Компания, в которой я работаю, предпочла бы, чтобы я использовал MySQL вместо MSSQL. Поэтому я скачал последнюю версию драйвера (6.1) и портирую слой БД.

Однако я не могу найти функцию BeginExecuteReader, которая принимает обратный вызов в качестве параметра.

Это по какой-то причине? Или это работает по-другому с MySQL?

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

Кто-нибудь есть идеи, как справиться с этим? (кроме изменения драйвера, который, вероятно, не в моих силах)

R

Ответы [ 3 ]

1 голос
/ 08 октября 2010

Версия 6.3.4 MySQL Connector реализует асинхронные методы, но кажется, что он только вызывает делегат асинхронно, поэтому он не будет блокировать вызывающий поток, но не будет сохранять потоки из ThreadPool. Вот отчет об ошибке .

И, как вы сказали, у него нет параметра обратного вызова. Вот отчет об ошибке .

Мне кажется, поставщики данных devart правильно реализуют асинхронные методы, но они не бесплатны.

В любом случае, асинхронные вызовы базы данных сами по себе НЕ подразумевают лучшей масштабируемости. Я рекомендую прочитать статью " Должны ли мои вызовы базы данных быть асинхронными? " для углубленного анализа.

0 голосов
/ 08 октября 2010

Поддержка потоков MySQL кажется мне запоздалой мыслью.

Вы не можете, например, через C API отменить выданный запрос; скорее, функция запроса просто блокирует. Чтобы сделать несколько одновременных запросов, требуется один поток на запрос!

Попробуйте использовать Postgres. Я не использовал его (C API отпугнул меня - все эти typedefs), но он, безусловно, имеет надлежащую поддержку многопоточных запросов (например, асинхронных вызовов и т. Д.).

0 голосов
/ 18 сентября 2009

Я не знаю конкретно об этом соединителе, но каждый другой соединитель, который я видел для mysql, просто ждет, пока сервер вернет данные во время вызовов execute () или query (). самое близкое, что вы получите, это использование «небуферизованной» версии, которая немедленно возвращается из execute () или query (), но блокируется, когда вы пытаетесь запросить следующую строку, но она еще не поступила с сервера mysql.

...