получение соединения БД через синглтон-класс - PullRequest
16 голосов
/ 02 мая 2009

Я создал одноэлементный класс, этот класс возвращает соединение с базой данных. Таким образом, мой вопрос, эта связь также удовлетворяет одноэлементным критериям?
Если нет, то как я могу сделать это синглтоном.
Вот код.

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

Ответы [ 6 ]

27 голосов
/ 02 мая 2009

Ваш синглтон все еще выключен.

Что касается шаблона синглтона, см. Очень хорошее и подробное описание Джона Скита здесь: http://www.yoda.arachsys.com/csharp/singleton.html

Использование Singleton для объекта SqlConnection - действительно очень плохая идея. Нет никаких причин делать это вообще.

Если вы пытаетесь избежать снижения производительности с помощью «new SqlConnection ()» или «connection.Open ()», имейте в виду, что на самом деле не наблюдается никакого снижения производительности из-за пулов соединений, которые происходят за кулисами. Пул соединений управляет открытием / закрытием дорогих соединений . Не объект SqlConnection.

Вы не сможете открыть несколько SqlDataReaders / Commands одновременно с соединением и столкнетесь с проблемами блокировки потоков, если вы попытаетесь совместно использовать один и тот же объект соединения с несколькими потоками.

Шаблон синглтона является наиболее часто используемым и злоупотребляемым шаблоном, и есть много побочных эффектов синглтона, о которых вы можете не знать. Очень хорошие разговоры об опасности синглетонов здесь http://www.youtube.com/watch?v=-FRm3VPhseI

5 голосов
/ 30 ноября 2012

В .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;
      }
   }
}
4 голосов
/ 02 мая 2009

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

1 голос
/ 22 апреля 2011

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

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

    get
    {
     if(instance == null) //important coz, the class will be instantiated only on the first call
     {
       instance = new singletonDb;
     }
     return instance;
    }
    
1 голос
/ 02 мая 2009

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

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

1 голос
/ 02 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...