Я только начал использовать структуру OpenNETCF.ORM, и у меня возникла проблема. Каков правильный способ использования SqlCeDataStore в многопоточном приложении?
В однопоточном приложении я бы просто использовал статическое поле:
public class MyApp
{
private static SqlCeDataStore _store;
public static SqlCeDataStore Store
{
get {
if (_store == null) {
_store = new SqlCeDataStore("database.sdf");
// other initialization stuff, DiscoverTypes() etc...
}
return _store;
}
}
}
И тогда я буду использовать его так:
var customers = MyApp.Store.Select<Customer>().ToArray();
После некоторых исследований на SQL Server Compact я обнаружил, что соединения не являются потокобезопасными, поэтому каждый поток должен иметь собственное соединение. OpenNETCF.ORM имеет возможность использовать новое соединение при каждом подключении к базе данных. Должен ли я просто использовать это?
Другой вариант - создать новый SqlCeDataStore для каждого потока. Это лучше?
Каков правильный путь?
Мы используем SQL Compact в разнообразных многопоточных приложениях с использованием OpenNETCF ORM без каких-либо проблем. Мы запускаем их на полной Windows и Windows CE.
Мы используем поведение подключения "Поддержание обслуживания", когда для всех вызовов CRUD создается новое соединение, но для выполнения работ по техническому обслуживанию (создание таблиц и т.д.) Поддерживается одно фоновое. Это обеспечивает хорошую производительность и разумную степень безопасности резьбы.