2009-05-02 2 views
12

Я создал одноэлементный класс, этот класс возвращает соединение с базой данных. Итак, мой вопрос заключается в том, что эта связь также удовлетворяет критериям одиночного критерия?
Если нет, то как я могу сделать это singleton.
Вот код.Получение соединения db через 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

кода обновляется, теперь комментировать новый код – Sharique

+0

вы думали о инъекционной зависимости SQLConnection к вашему одноплодному классу? –

ответ

23

Ваш Singleton все еще выключен.

Насколько одноплодной картина идет, пожалуйста, см Jon тарелочкам очень хорошо и подробное описание здесь: 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

+0

Всю свою жизнь я обманывал, не подключаясь к каждому звонку, потому что «он убивает производительность приложения». – BlaShadow

+0

Ссылка на [обновленную статью Джона Скита] (http://csharpindepth.com/Articles/General/Singleton.aspx) на одноэлементном шаблоне может пригодиться. – Corio

1

Если нет другого способа получить соединение с БД, и если этот атрибут не может быть перезаписан, я бы сказал, что да. Если это то, что вы делаете, вы, вероятно, слишком сильно забираете этот синглтон. Что делать, если БД временно отключается, и ваше приложение теряет связь? Затем вам придется перезапустить приложение, чтобы он мог снова использовать БД.

1

Я не могу ответить на этот вопрос, не видя кода, я думаю. Если вы говорите, что в вашем приложении будет только один экземпляр подключения к базе данных, это может сработать, если вы можете гарантировать, что ваше приложение будет работать только в одном потоке (или, по крайней мере, все операции с использованием соединения с БД), поскольку вы можете 't (насколько я знаю, так или иначе) выполнить несколько операций параллельно с одним и тем же соединением.

Кроме того, если это означает, что ваше приложение будет поддерживать открытое соединение между использованием, я бы посоветовал ему. Соединения DB ограничены ресурсами на сервере БД, поэтому вы должны держать их открытыми только тогда, когда они нужны, а затем закрывать их.

4

Само соединение не удовлетворяет критериям 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.

+0

Я изменил код, проверьте сейчас. – Sharique

1

Singleton означает, что созданный вами класс может быть создан только один раз. Так что если вы хотите, чтобы это произошло, сделать две вещи:.

  1. сделать конструктор приватным (Это должно предотвратить другие классы от доступа к нему.)
  2. экземпляр класса как:

    get 
    { 
    if(instance == null) //important coz, the class will be instantiated only on the first call 
    { 
        instance = new singletonDb; 
    } 
    return instance; 
    } 
    
4

В .NET C# вы можете wrtie ваш синглтон как этот

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; 
     } 
    } 
} 
+0

Для получения дополнительной информации см. Эту страницу MSDN: https://msdn.microsoft.com/en-us/library/ff650316.aspx –

Смежные вопросы