Используете статический экземпляр DbProviderFactory в ADO.NET?
Я использую следующий код в моем приложении asp.net. Согласно этому коду, для всех пользователей приложения будет только один экземпляр DBProviderFactory. Создаст ли это проблему в многопользовательской среде? Таким образом, все пользователи будут использовать один и тот же объект DbProviderFactory для создания соединений. Я не уверен, создаст ли это какой-то тип скрытых проблем в многопользовательской среде.
Причина, по которой я использую статический экземпляр для DbProviderFactory, заключается в том, что метод GetFactory не вызывается каждый раз, когда требуется создать экземпляр подключения. Это, я думаю, позволило бы быстрее получить объект подключения. Есть ли недостатки в моих рассуждениях?
public class DatabaseAccess
{
private static readonly DbProviderFactory _dbProviderFactory =
DbProviderFactories.GetFactory(System.Configuration.ConfigurationManager.ConnectionStrings["DB"].ProviderName);
public static DbConnection GetDbConnection()
{
DbConnection con = _dbProviderFactory.CreateConnection();
con.ConnectionString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["DB"].ConnectionString;
return con;
}
}
1 ответ
Это выглядит хорошо, но, вероятно, не создаст интересную эффективность.
Создание объектов в.NET быстро. Поэтому создание фабрики не займет много времени. Получение соединения из удаленной базы данных происходит, но с пулом соединений это обычно не проблема.
Вероятно, фабрика не реализует свое собственное состояние и выглядит так, что она, вероятно, неизменна. Так что доступ из разных потоков, вероятно, в порядке.
Статические объекты не являются сборщиком мусора. Я сомневаюсь, что завод будет расти в размерах, так что это не должно быть проблемой.
Таким образом, вы избегаете кучу дешевых созданий объектов, кучу дешевых фоновых сборок мусора и имеете небольшой риск того, что производный класс действительно имеет состояние и не является поточно-ориентированным в зависимости от точной реализации, возвращаемой GetFactory.