You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多线程并行访问时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:57:17