Многопоточность: одновременное выполнение многих запросов
От: Kimus  
Дата: 23.08.07 14:27
Оценка:
Я пишу многопоточную объектно-ориентированную программу на C#, которая работает с MSSQL2005. При этом различные классы реализуют функционал доступа к базе данных — интерфейс класса ориентирован на логику работы программы, а в реализации методов и свойств "зашита" логика работы с базой данных.

При этом часто возникают ситуации, когда требуется одновременное выполнение множества SQL-запросов из разных потоков.

Вопрос состоит в следующем — как в этом случае лучше организовать соединение с базой данных (SqlConnection) в такой многопоточной среде? Я вижу два варианта:

(1) сложный: иметь столько соединений, сколько запущено потоков, и в каждом потоке использовать свое соединение. Реализовать это можно, например, с помощью глобального объекта Dictionary<int, SqlConnection>, где ключом будет ID обращающегося потока, и класса-оболочки DataBaseConnection, статическое свойство Connection которого будет проверять, есть ли в словаре соединение для текущего потока и, если нет — то создавать его. Идея кажется интересной, но возникают накладные расходы, связанные с обращением к свойству, поиску в словаре, плюс надо как-то отслеживать завершение работы потоков и закрывать соответствующие соединения

(2) простой: перед выполнением любого запроса (или набора запросов, которые гарантированно выполняются в одном потоке) создавать новое соединение с БД, а потом закрывать его?

Хочу узнать ваше мнение — какой метод лучше?

велики ли накладные расходы на создание соединения (запросов довольно много)? Как можно недорого отследить завершение/создание потока в первом способе (кроме проверки словаря)?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.