静态类中的并发

时间:2012-03-22 07:20:26

标签: c# concurrency static

任何人都可以建议我这段代码是否会导致并发。

这是一个在表单中使用的静态类,用于某些数据库事务。

这涉及从asp.net页面调用静态函数并将参数作为ref类型传递。

我正在使用引用类型。

由于它是基于Web的,它是否创建了一些并发性。 ///

以下是我的示例类中的代码。

public static class DataClass
{

  static SqlConnection con = new SqlConnection(
      ConfigurationManager.ConnectionStrings["sqlserverconnectionstring"]
                                                .ConnectionString);

    public static string  GetCon()

    {

     return ConfigurationManager.ConnectionStrings["sqlserverconnectionstring"].ConnectionString;

    }
    public static void Conn(ref SqlConnection con)
    {
        if (con.State == ConnectionState.Closed)
        {
            con.Open();
        }
    }
    public static DataSet GetDataSet(string qry)
    {
        SqlDataAdapter adp = new SqlDataAdapter(qry, con);
        DataSet ds = new DataSet();
        adp.Fill(ds);
        return ds;
    }
    public static bool ExecuteCommand(ref SqlCommand cmd)
    {
        bool i =true;
        cmd.Connection = con;
        Conn(ref con);
        SqlTransaction trans =con.BeginTransaction(); 
        cmd.Transaction = trans;
        try
        {
            cmd.ExecuteNonQuery();
            trans.Commit();
        }
        catch
        {
            trans.Rollback();
            i = false;
        }
        finally
        {
            cmd.Dispose();
            con.Close(); 
        }
        return i;
    }
}

2 个答案:

答案 0 :(得分:1)

由于您已经定义了静态SQLConnection,我相信它可能会导致并发问题。

static SqlConnection con = new SqlConnection (ConfigurationManager.ConnectionStrings["sqlserverconnectionstring"].ConnectionString);

如果两个不同的对象尝试运行查询,它们将在同一个sql连接对象实例上运行它们。

答案 1 :(得分:1)

是的,这不是线程安全的/但是,由于SqlClient默认使用连接池,你可以放弃静态连接,并让每个用法做类似的事情:

using(var conn = OpenConnection()) {
    ...//code
}

OpenConnection每次都会返回 SqlConnection。这与每次不同的底层连接不同,并且您通常(在winform中)找到使用的连接数非常少(如果您真的很幸运,则为1)。