получение подключения к базе данных через одноэлементный класс
-
03-07-2019 - |
Вопрос
Я создал одноэлементный класс, этот класс возвращает соединение с базой данных.Итак, мой вопрос в том, что это соединение также удовлетворяет критериям singleton?
Если нет, то как я могу сделать его одноэлементным.
Вот этот код.
public sealed class SingletonDB
{
static readonly SingletonDB instance = new SingletonDB();
static SqlConnection con =new SqlConnection(ConfigurationManager.ConnectionStrings["mydb"].ConnectionString);
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static SingletonDB()
{
}
SingletonDB()
{
}
public static SingletonDB Instance
{
get
{
return instance;
}
}
public static SqlConnection GetDBConnection()
{
return con;
}
}
Решение
Ваш синглтон все еще выключен.
Что касается шаблона синглтона, см. очень хорошее и подробное описание Джона Скита здесь: http://www.yoda.arachsys.com/csharp/singleton.html р>
Использование Singleton для объекта SqlConnection - действительно очень плохая идея. Нет никаких причин делать это вообще.
Если вы пытаетесь избежать снижения производительности " new SqlConnection () " или "connection.Open ()" Имейте в виду, что на самом деле производительность не снижается из-за пулов соединений, которые происходят за кулисами. Пул соединений управляет открытием / закрытием дорогих соединений. Не объект SqlConnection.
Вы не сможете открыть несколько SqlDataReaders / Commands одновременно с соединением и столкнетесь с проблемами блокирования потоков, если вы попытаетесь использовать один и тот же объект соединения для нескольких потоков.
Шаблон Singleton - это наиболее часто используемый и злоупотребляемый шаблон, и существует множество побочных эффектов синглтона, о которых вы можете не знать. Очень хороший разговор об опасностях одиночных игр здесь http://www.youtube.com/watch?v = -FRm3VPhseI р>
Другие советы
В .NET C # вы можете написать свой синглтон вот так
public class Singleton{
public static readonly Singleton Instance= new Singleton();
private Singleton(){}
или для многопоточной среды:
using System;
public sealed class Singleton
{
private static volatile Singleton instance;
private static object syncRoot = new Object();
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
}
Само соединение не удовлетворяет критериям одноэлементности, поскольку вы можете создать несколько экземпляров объекта подключения к базе данных.Экземпляр singleton по определению может быть создан только один раз.
Ты может сделайте SqlConnection частью Singleton, изменив ваш пример на этот:
public sealed class SingletonDB
{
private static readonly SingletonDB instance = new SingletonDB();
private readonly SqlConnection con =new SqlConnection(ConfigurationManager.ConnectionStrings["mydb"].ConnectionString);
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static SingletonDB()
{
}
private SingletonDB()
{
}
public static SingletonDB Instance
{
get
{
return instance;
}
}
public SqlConnection GetDBConnection()
{
return con;
}
}
Таким образом, SqlConnection, используемый вашим классом SingletonDB, будет иметь одно и только одно SqlConnection, таким образом, следуйте шаблону Singleton.
Если нет другого способа получить соединение с БД, и если этот атрибут не может быть перезаписан, я бы сказал, да. Если это то, что вы делаете, вы, вероятно, зашли слишком далеко. Что если база данных временно отключится и ваше приложение потеряет связь? Затем вам придется перезапустить приложение, чтобы оно могло снова использовать БД.
Я не могу ответить на этот вопрос, не увидев некоторый код, я думаю. Если вы говорите, что в вашем приложении будет только один экземпляр подключения к БД, это может сработать, если вы можете гарантировать, что ваше приложение будет работать только в одном потоке (или, по крайней мере, все операции, использующие подключение к БД), поскольку вы можете '(насколько я знаю в любом случае) выполнить несколько операций в параллель на одном и том же соединении. Р>
Кроме того, если это означает, что ваше приложение будет поддерживать связь между использованиями, я бы посоветовал против этого. Соединения с БД - это ограниченные ресурсы на сервере БД, поэтому вы должны держать их открытыми только тогда, когда они необходимы, а затем закрывать их.
Singleton означает, что созданный вами класс может быть создан только один раз. Поэтому, если вы хотите, чтобы это произошло, сделайте две вещи:
<Ол>создайте экземпляр класса как:
get
{
if(instance == null) //important coz, the class will be instantiated only on the first call
{
instance = new singletonDb;
}
return instance;
}