Получение соединения 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;
    }