Вызов асинхронной процедуры с поставщиком данных DB2 .NET - PullRequest
1 голос
/ 13 мая 2009

Есть ли способ асинхронного вызова хранимой процедуры DB2 с использованием поставщика данных DB2 .NET?

Ответы [ 4 ]

2 голосов
/ 15 мая 2009

Есть несколько способов - какой из них подходит, будет зависеть от вашего сценария.

То, что я делал в Oracle, получало тысячи элементов XML из БД на основе очереди идентификаторов рабочих элементов. Выдача их за один раз с помощью устройства чтения данных не работала, поэтому я вывел их по одному за раз в нескольких разных потоках (каждый поток получал рабочий элемент из очереди до тех пор, пока очередь не опустела). Когда каждый отдельный поток получил результат обратно, он поместил XML в очередь потребителя-производителя, основанную на превосходном учебном пособии Джозефа Албахари . Отдельный поток посмотрел на очередь потребителя-производителя, выполнил XSL-преобразования данных и записал их в файл - конечно же, я тестировал выполнение сначала в однопоточном режиме, и это было значительно медленнее.

Я попытался использовать threadpool / асинхронных делегатов для начала (так как общий совет по созданию потоков - по возможности использовать пул потоков, что делегаты также делают косвенно), что может работать, если у вас не более 64 предметов. WaitHandle.WaitAll обычно имеет ограничение в 64 рабочих элемента. . Поскольку у меня было 1000 с, это не было хорошим вариантом, кроме как делать их партиями по 64, которые казались грязными.

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

Самое главное - убедиться, что у вас есть полностью отдельные объекты БД в каждом потоке, иначе вы столкнетесь с проблемами потоков.

Если вы хотите просто выполнить 1 хранимую процедуру в асинхронном режиме в приложении Windows form / WPF, вам может понадобиться использовать компонент фонового рабочего .

Дайте мне знать, если вам нужна дополнительная информация.

1 голос
/ 03 июля 2009

Если DB2 не поддерживает BeginExecuteReader, вы можете использовать асинхронные делегаты для решения этой задачи. Функционально это было бы то же самое, за исключением того, что вы реализуете это самостоятельно, а не используете что-то встроенное.

Проверьте пример здесь: Проблема с асинхронным запросом sql…

1 голос
/ 13 мая 2009

BeginExecuteNonQuery не работает?

0 голосов
/ 13 мая 2009

Проблема в том, что BeginExecuteNonQuery отсутствует.

...