Обновлена ​​многопоточная база данных - PullRequest
0 голосов
/ 12 декабря 2011

У меня есть служба Windows (C #), в которой я создаю несколько потоков, которые будут пытаться обновить состояние в моей базе данных (SQL Server 2005).

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

Уже есть открытый DataReader, связанный с этим подключением который должен быть закрыт первым

Но когда я использую блокировку (для статического объекта), обновление происходит очень медленно.

Может кто-нибудь помочь мне в решении этой проблемы.

Ответы [ 3 ]

5 голосов
/ 12 декабря 2011

Каждый объект команды, который вы используете в своем приложении, должен иметь свой собственный объект подключения, который вы открываете непосредственно перед выполнением команды и закрываете сразу после этого. (Предпочтительно, завернутый в оператор using)

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

Единственное, что должно быть разделено между потоками - это соединение string .

5 голосов
/ 12 декабря 2011

Убедитесь, что ваш DataReader закрыт, прежде чем пытаться использовать его соединение для чего-либо еще. Я хотел бы предложить вам реорганизовать свой код, чтобы не делить соединения между потоками. Если вы сможете предоставить больше информации о том, чего именно вы пытаетесь достичь, я могу предоставить полезный пример кода.

0 голосов
/ 12 декабря 2011

Это происходит, когда у вас есть несколько DataReader, открытых одновременно по одному и тому же соединению, то есть вы вызываете SqlCommand.ExecuteReader, но не закрываете SqlDataReader, возвращенный этим методом, перед повторным вызовом (либо для той же команды, либо для другой команды в той же соединение).
Также попробуйте:
MultipleActiveResultSets=True в цепях соединения.

...