Я пишу многопоточную объектно-ориентированную программу на C#, которая работает с MSSQL2005. При этом различные классы реализуют функционал доступа к базе данных — интерфейс класса ориентирован на логику работы программы, а в реализации методов и свойств "зашита" логика работы с базой данных.
При этом часто возникают ситуации, когда требуется одновременное выполнение множества SQL-запросов из разных потоков.
Вопрос состоит в следующем — как в этом случае лучше организовать соединение с базой данных (SqlConnection) в такой многопоточной среде? Я вижу два варианта:
(1) сложный: иметь столько соединений, сколько запущено потоков, и в каждом потоке использовать свое соединение. Реализовать это можно, например, с помощью глобального объекта Dictionary<int, SqlConnection>, где ключом будет ID обращающегося потока, и класса-оболочки DataBaseConnection, статическое свойство Connection которого будет проверять, есть ли в словаре соединение для текущего потока и, если нет — то создавать его. Идея кажется интересной, но возникают накладные расходы, связанные с обращением к свойству, поиску в словаре, плюс надо как-то отслеживать завершение работы потоков и закрывать соответствующие соединения
(2) простой: перед выполнением любого запроса (или набора запросов, которые гарантированно выполняются в одном потоке) создавать новое соединение с БД, а потом закрывать его?
Хочу узнать ваше мнение — какой метод лучше?
велики ли накладные расходы на создание соединения (запросов довольно много)? Как можно недорого отследить завершение/создание потока в первом способе (кроме проверки словаря)?