SqlConnection作为静态单例对象

时间:2009-10-19 22:25:16

标签: c# static singleton sqlconnection

public class db
{
    public static string connectionString =
           WebConfigurationManager.ConnectionStrings["connectString"].ConnectionString;
    public static SqlConnection OpenConnection() 
    {
        SqlConnection connection = new SqlConnection(connectionString);
        connection.Open();
        return connection;
    }
}

我看到这样的代码,它尖叫着错!它适用于ASP.NET(2.0)。我明白这是错的。

对于一个你不应该打开SqlConnection并返回它,两个为什么你要进行静态SqlConnection?如果有多个人同时尝试使用它,这不会产生问题吗?

4 个答案:

答案 0 :(得分:12)

什么是static是 OpenConnection()返回连接的Method。然而,每次都会返回一个新连接(假设调用者将在适当的时候负责处理此连接对象)。

换句话说,显示的db类根本不是单例。混淆可能是因为一个人不需要实例化db的实例以便使用它的OpenConnection()方法(因为它是静态的),而其余的代码可能包含多个片段,如

myConn = db.OpenConnection();
-- then do something with myConn

答案 1 :(得分:3)

我不是100%确定问题是什么,而是回答这个问题

  

如果多重则不会产生问题   人们正在尝试同时使用它   时间?

不,没有问题,因为每次调用OpenConnection()都会构造一个新的SqlConnection实例。这并不意味着代码不是出于其他原因的垃圾。我至少希望调用这个方法看起来像这样:

using(var conn = db.OpenConnection())
{
  // stuff
}

答案 2 :(得分:0)

你不能只说“出错的尖叫”,然后错误地应用“单身人士”这个词。为什么单个静态连接是一种糟糕的方法?它不会每次都重新创建它,然后您的整个应用程序可以共享连接。你是否需要为每个frigg'n sql调用创建,打开和关闭,这些都是愚蠢的尖叫。无论哪种方式,ADO都应该管理这个。

答案 3 :(得分:0)

连接对象必须限定为执行事务的方法。 在线程之间共享相同的连接对象将破坏连接池。 请参阅this question on SQLDataReader.GetOrdinal() fails rarely with IndexOutOfRange