Класс источника данных C # и безопасность потоков - PullRequest
2 голосов
/ 03 марта 2010

Что было бы хорошим способом написать в C # класс данных .NET3.5 Thread Safe. Класс будет подключаться к SQL Server, и каждый метод будет выполнять хранимую процедуру.

Когда код работал однопоточным. У меня был класс источника данных Singleton с частным членом SqlConnection. Каждый метод открывал и закрывал это соединение. При выполнении этого с несколькими потоками возникает проблема, когда при определенных сценариях соединение уже было открыто другим потоком. Как лучше всего переписать этот класс?

Примечание : Под DataSource не подразумевается любой встроенный класс .NET, но класс Model, который предоставляет данные контроллеру.

Ответы [ 4 ]

3 голосов
/ 03 марта 2010

Почему бы вам просто не использовать встроенный пул ado.net: создайте и откройте соединение непосредственно перед операцией, и утилизируйте как можно скорее для каждого метода.

2 голосов
/ 03 марта 2010

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

И сделайте его также исключительным:

 using (var conn = new SqlConnection(...))
 {
    // call SP
 }
2 голосов
/ 03 марта 2010

SQL Server уже координирует потоки через очень сложные механизмы. Вам не нужно делать что-то конкретное для обеспечения безопасности потоков, чтобы просто выполнить процедуру сохранения.

0 голосов
/ 03 марта 2010

Вы должны были бы подробнее рассказать о том, что должен делать ваш класс DataSource. Вам не нужно реализовывать какой-либо код безопасности потока, если каждый из ваших методов Create / Read / Update / Delete не изменяет никакого состояния.

ОБНОВЛЕНИЕ: В вашем случае я рекомендую просто заново создать новый экземпляр SqlConnection в каждом методе вашего класса DataSource, поскольку ADO.NET уже обрабатывает пул для вас.

...