C# 在所有线程之间使用公共SQL Server连接并同时使用
我需要每个线程连接到一个数据库并执行一些查询,也许某个线程可以在同一时间执行查询 我创建了一个静态类,用于使用ADO.NET连接到SQL Server数据库:C# 在所有线程之间使用公共SQL Server连接并同时使用,c#,sql-server,multithreading,static,ado.net,C#,Sql Server,Multithreading,Static,Ado.net,我需要每个线程连接到一个数据库并执行一些查询,也许某个线程可以在同一时间执行查询 我创建了一个静态类,用于使用ADO.NET连接到SQL Server数据库: public static class ADOFire { static System.Data.SqlClient.SqlConnection Cnn = new System.Data.SqlClient.SqlConnection(); public static string CnnString { get; s
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, "Some Query 'select * from x'");
基于,在打开新连接或使用现有连接之间没有太大区别
每当用户在连接上调用Open时,池处理程序都会在池中查找可用的连接。如果池连接可用,它会将其返回给调用方,而不是打开新连接。当应用程序在连接上调用Close时,池处理程序将其返回到活动连接的池集,而不是关闭它。一旦连接返回到池中,就可以在下一次打开的调用中重用它
我的问题是:
一个连接可以同时为不同的线程服务吗?一路通
数据混乱的问题不是由静态功能造成的吗
不,ADO.NET不允许两个线程同时访问同一个.CONCONNECT
是的,但问题不在于statix方法,而在于静态连接字段
您应该做的是让静态方法createnew并将连接返回给调用者,然后完全删除该字段。典型用法:
使用var conn=CreateConnection{
//…用它!
}
我还严重关切:
-为什么要传入命令、命令文本和适配器
-缺乏参数;这表明SQL注入存在巨大的安全问题
-使用数据表几乎从来都不是最合适的工具这可能会有所帮助:重新阅读StackOverflow问题并回答您发布的问题。SqlConnection的静态方法是线程安全的-例如:您可以有许多线程调用SqlConnection.ChangePassword和SqlConnection.ClearAllPools-但是实例方法不能保证线程安全。不要尝试在线程之间共享一个SqlConnection,通过连接池为每个需要一个SqlConnection的线程获取一个新的SqlConnection。-Gravell tnx,如果我将我的GetTable方法更改为您的解决方案,当许多线程同时调用此方法时,假设它是静态的,没有问题吗?