【问题标题】:Singleton design pattern is preferred to get a DB Connection单例设计模式优先获得数据库连接
【发布时间】:2014-04-04 14:56:28
【问题描述】:

我看到许多开发人员为数据库连接创建了单例类。我只想知道当应用程序将被许多用户使用时是好是坏。如果不好,请讨论上述模式可能发生的所有不良情况。

public class ConnSingleton
{
        private static ConnSingleton dbInstance;
        private readonly SqlConnection conn = new SqlConnection(@"Data Source=127.0.0.1;database=soa;User id=sa1;Password=sa1;");       
     
        private ConnSingleton()
        {
        }

        public static ConnSingleton getDbInstance()
        {
            if (dbInstance == null)
            {
                dbInstance = new ConnSingleton();
            }

            return dbInstance;
        }

        public SqlConnection GetDBConnection()
        {
            try
            {
                conn.Open();
                Console.WriteLine("Connected");
            }
            catch (SqlException e)
            {
                Console.WriteLine("Not connected : "+e.ToString());
                Console.ReadLine();
            }
            finally
            {
                Console.WriteLine("End..");
               // Console.WriteLine("Not connected : " + e.ToString());
                Console.ReadLine();
            }
            Console.ReadLine();
            return con;
        }
}

public static void Main(string[] args)
{
     ConnSingleton cs = ConnSingleton.getDbInstance();
     cs.GetDBConnection();           
     Console.WriteLine("Connection established");
}

【问题讨论】:

  • 真的没有必要坚持一个连接对象。它应该始终包裹在 using 中并在之后处理。 .NET 还缓存连接,因此也没有理由保持打开状态。我会更倾向于实例化并返回一个新的 SqlConnection 的静态方法。
  • 我很想知道,当我们使用内置连接池时,谁来创建和维护连接池。它是由 OS 或 sql server 还是 dotnet runtime 管理的?

标签: c# oop singleton


【解决方案1】:

我看不出这门课有什么好处。如果您希望这样(我不赞成),那么您不会从一堆静态方法中获得任何好处。单例实例有什么用?如何将 SqlConnection 变量放入 using 块中?

我认为对于想要全局变量的人来说,单例模式是一种过度使用的模式,但读过一本提到全局变量不好这一事实的书。现在他们又找到了另一本书,说“单例”是一种模式,模式是“好的”,他们终于有了一个拥有全局的借口。

作为一个全局变量是单例的副作用。如果您将其用于副作用,则不是很好地使用该模式。我会说这是一种滥用。

单例几乎不可能进行单元测试。这甚至不是线程保存,对非单例没有任何用处。所以从我的角度来看......删除课程。

有多少人使用该应用程序无关紧要。每个都有自己的进程和自己的单例,这可能很糟糕。

【讨论】:

  • 单例也称为“反模式”。
  • 当我们关闭任何 sql 连接然后连接对象立即移动到池中?
  • @Mou:答案是“视情况而定”。您应该提出一个新问题以获得好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 2021-03-22
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
相关资源
最近更新 更多