Получение соединения db через singleton class
Я создал одноэлементный класс, этот класс возвращает соединение с базой данных. Итак, мой вопрос заключается в том, что эта связь также удовлетворяет критериям singleton?
Если нет, то как я могу сделать это 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;
}
}
Ответы
Ответ 1
Ваш Синглтон все еще выключен.
Что касается шаблона singleton, см. Jon Skeet очень хорошее и подробное описание здесь: http://www.yoda.arachsys.com/csharp/singleton.html
Использование Singleton для объекта SqlConnection - действительно, действительно плохая идея. Нет оснований делать это вообще.
Если вы пытаетесь избежать хита производительности "нового SqlConnection()" или "connection.Open()", имейте в виду, что там действительно нет производительности, потому что пул соединений происходит за кулисами. Соединение Pooling обрабатывает открытие/закрытие дорогих соединений. Не объект SqlConnection.
Вы не сможете одновременно открыть несколько SqlDataReaders/Commands с соединением и столкнуться с проблемами блокировки потоков, если вы пытаетесь использовать один и тот же объект соединения с несколькими потоками.
Шаблон Singleton является наиболее используемым и злоупотребляемым шаблоном, и есть много побочных эффектов синглтона, о которых вы, возможно, и не подозреваете. Очень хорошие разговоры об опасностях одиночных игр здесь http://www.youtube.com/watch?v=-FRm3VPhseI
Ответ 2
Само соединение не удовлетворяет критериям 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.
Ответ 3
В .NET С# вы можете использовать свой синглтон, подобный этому
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;
}
}
}
Ответ 4
Если нет другого способа получить соединение с БД, и если этот атрибут не может быть перезаписан, я бы сказал "да". Если это то, что вы делаете, вы, вероятно, слишком сильно забираете этот синглтон. Что делать, если БД временно отключается, и ваше приложение теряет связь? Затем вам придется перезапустить приложение, чтобы оно снова могло использовать БД.
Ответ 5
Я не могу ответить на этот вопрос, не видя какого-то кода, я думаю. Если вы говорите, что в вашем приложении будет только один экземпляр подключения к базе данных, это может сработать, если вы можете гарантировать, что ваше приложение будет работать только в одном потоке (или, по крайней мере, все операции с использованием соединения с БД), поскольку вы можете 't (насколько я знаю, так или иначе) выполнить несколько операций параллельно с одним и тем же соединением.
Кроме того, если это означает, что ваше приложение будет поддерживать соединение открытым между использованием, я бы посоветовал ему. Соединения DB ограничены ресурсами на сервере БД, поэтому вы должны держать их открытыми только тогда, когда они необходимы, а затем закрыть их.
Ответ 6
Синглтон означает, что класс, который вы создали, может быть создан только один раз. Поэтому, если вы хотите, чтобы это произошло, выполните две вещи:
- Сделать конструктор закрытым. (Это делается для того, чтобы другие классы не обращались к нему.)
-
создать экземпляр класса следующим образом:
get
{
if(instance == null) //important coz, the class will be instantiated only on the first call
{
instance = new singletonDb;
}
return instance;
}