SqlServer类静态方法 - 线程安全

时间:2011-12-13 12:06:52

标签: c# thread-safety static-methods

我已经创建了一个类来简化我的应用程序中SQL服务器的使用。

public static class SqlServer
{        
    public static void QueryNoReturn(string ConnectionString, string Query, SqlParameter[] Parameters, bool IsStoredProcedure)
    {
        using (SqlConnection conn = new SqlConnection(ConnectionString))
        {
            // Create the command to run
            SqlCommand command = new SqlCommand(Query, conn);

            // If we are running a stored procedure
            if (IsStoredProcedure)
                command.CommandType = System.Data.CommandType.StoredProcedure;

            // Add parameters if they exist
            if (Parameters != null)
                command.Parameters.AddRange(Parameters);

            try
            {
                // Open the connection to the database
                conn.Open();

                // Execute the command and assign to the result object
                command.ExecuteNonQuery();

                conn.Close();

                command.Parameters.Clear();
            }
            catch (SqlException sqlex)
            {
                throw new Exception(
                    string.Format("{0} \"{1}\"", IsStoredProcedure ? "Procedure" : "Query", Query),
                    sqlex);
            }
        }
    }
}

如果我每秒多次调用这种静态方法(大约50次),那么我会看到线程安全问题吗?

我可以轻松地创建一个Factory或其他一些特定于实例的对象,但我选择此选项不是为了简单。

2 个答案:

答案 0 :(得分:2)

由于您没有使用该类的任何共享资源,因此这似乎是“线程安全的”。

这当然忽略了数据库本身的任何并发问题。

您也应该将SqlCommand创建包装在using语句中。

由于您在SqlConnection语句中创建了using,因此您无需在其上显式调用Close,因为它将在处理连接时完成。< / p>

答案 1 :(得分:1)

没有。访问共享资源时可能会遇到线程安全问题,但是你不这样做(至少在这种方法中没有)。

顺便说一下,将conn.Close();移动到finally子句,这样就可以关闭连接,即使你遇到异常也是如此。