多线程并行访问时SqlConnection是否线程安全?是否每次创建实例?
关于多线程访问GetData方法的疑问解答
1. 每次调用GetData都会创建新的SqlConnection吗?
是的,不管是不是多线程环境,每次调用GetData方法都会创建一个全新的SqlConnection实例。因为new SqlConnection(connectionString)是方法内部的局部变量声明,每个线程调用这个方法时,都会独立执行这行代码,生成属于当前线程的连接对象。
而且using块会在代码块结束后自动调用Dispose()释放连接,这是ADO.NET里推荐的使用方式——不要长期持有连接,用的时候创建,用完就释放,底层的连接池会自动管理物理连接,不会造成性能浪费。
2. 线程安全性分析
GetData方法的线程安全性
这个方法是线程安全的。因为方法里的所有变量(con、da、ds、deptId)都是局部变量,局部变量会被分配到每个线程的栈上,属于线程私有资源,多个线程调用时不会互相干扰,各自处理各自的请求和数据。
SqlConnection类的线程安全性
SqlConnection本身不具备线程安全性,绝对不能让多个线程同时操作同一个SqlConnection实例(比如一个线程调用Open,另一个线程调用Close,或者同时执行命令),这样会导致不可预期的错误。
但你的代码完全规避了这个问题——每个线程都使用自己独立的SqlConnection实例,互相不共享,所以不会有线程安全问题。
3. 代码额外提示:存在SQL注入风险
你的代码里直接把deptId拼接到SQL语句中,这是非常危险的,容易遭遇SQL注入攻击。建议改成参数化查询,示例如下:
public DataSet GetData(string deptId) { using(SqlConnection con = new SqlConnection(connectionString)) { string sql = "Select * FROM Employee where DeptId=@DeptId"; using(SqlDataAdapter da = new SqlDataAdapter(sql, con)) { da.SelectCommand.Parameters.AddWithValue("@DeptId", deptId); DataSet ds = new DataSet(); da.Fill(ds); return ds; } } }
内容的提问来源于stack exchange,提问作者Ambareesh
相关产品推荐
相关产品推荐

