在所有线程之间使用公共sql服务器连接

问题描述 投票:1回答:1

我需要每个线程连接到一个数据库并执行一些查询,也许某个线程一次可以执行查询。

我创建了一个用于通过ADO.NET连接到SQL数据库的静态类:

public static class ADOFire
{

    static System.Data.SqlClient.SqlConnection Cnn = new System.Data.SqlClient.SqlConnection();
    public static string CnnString { get; set; }
    public static void CreateConnection()
    {

        if (Cnn.State == ConnectionState.Open)
            return;
        Cnn.ConnectionString = CnnString = ConfigurationManager.ConnectionStrings["CnnString"].ToString();
        if (Cnn.State != System.Data.ConnectionState.Open) Cnn.Open();
    }


    public static System.Data.DataTable GetTable(System.Data.SqlClient.SqlCommand Com, System.Data.SqlClient.SqlDataAdapter Ada, string ComText)
    {
        CreateConnection();
        Com.Connection = Cnn;
        Ada.SelectCommand = Com;
        try
        {
            System.Data.DataTable T = new System.Data.DataTable();
            Com.CommandText = ComText;
            Ada.Fill(T);
            return T;
        }
        catch { return null; }
    }
}

并且在每个线程中,我这样调用静态函数:

System.Data.SqlClient.SqlCommand Com = new System.Data.SqlClient.SqlCommand();
System.Data.SqlClient.SqlDataAdapter Ada = new System.Data.SqlClient.SqlDataAdapter();
Datatable dt =  ADOFire.GetTable(Com ,Ada ,"Select * from X");

我的问题:

  1. 一个连接可以同时服务于不同的线程吗? (一个连接全部)
  2. 不是由于静态函数引起的数据混乱问题?

在此示例中是否有可能出现问题?任何意见对我都可能有用。

c# multithreading static ado.net sqlconnection
1个回答
0
投票

连接可以同时服务于不同的线程吗?

否-SqlConnection不保证是线程安全的。

SQL连接由.NET合并,因此创建它们通常并不昂贵。在需要时创建一个连接,并在使用完毕后将其处理。通过在using块中创建连接(以及命令和读取器),可以最有效地完成此操作。

© www.soinside.com 2019 - 2024. All rights reserved.