C # Многопоточный доступ к базе данных для Firebird (.NET) - PullRequest
1 голос
/ 06 ноября 2010

Я хотел бы воспользоваться многопоточностью, когда мы записываем данные из базы данных в наши собственные объекты. В настоящее время мы используем Firebird и извлекаем данные с помощью считывающего устройства «только вперед» FbDataReader.

Мы перебираем записи, хранящиеся в FbDataReader, и заполняем объект, добавляя объект в список, который затем используется в приложении. Все это происходит на уровне доступа к данным нашего приложения.

В идеале мы хотели бы извлечь данные из базы данных (в FbDataReader) и затем разделить работу записи в объекты (по одному на строку) между потоками. Проблема, которую я вижу, заключается в том, что FbDataReader предназначен только для пересылки, и различные потоки могут заставить читателя перейти к следующей записи до завершения другого потока.

Решением может быть выгрузка FbDataReader в индексированный список, массив или словарь, но это будет стоить.

У кого-нибудь есть идеи или мы просто тратим время на поиски рефакторинга этой части нашего кода?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2010

Вы можете попытаться создать новый поток и создать новое подключение к базе данных на основе существующей строки подключения. В одном потоке вы можете обрабатывать четные записи (2,4,6 и т. Д.), А в другом потоке - нечетные записи (1,3,5 и т. Д.). Однако это увеличит сложность вашего кода.

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

0 голосов
/ 06 ноября 2010

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

, например

where ID >= 0 && ID < 10000   << block 1 for data reader instance 1
where ID >= 10000 && ID < 20000  << block 2 for data reader instance 2
where ID >= 20000 && ID < 30000  << block 3 for data reader instance 3

Этот пример трех читателей позволит вам создать три объекта "одновременно".

Если вы дополнительно используете итератор C # , обернутый вокруг всего этого процесса, у вас может быть способ вернуть все объекты, как если бы они были одной коллекцией, без использования промежуточного хранилища для экземпляров.

foreach ( object o in MyIterator() ) { ....

Это приведет к тому, что объекты вернутся под баннер, используемый из одного потока, даже если они были созданы в разных потоках. Я просто сижу на лыжах в этой последней части.

...