当方法被不同线程并行访问时,SqlConnection对象线程安全吗?

问题描述 投票:0回答:2

我想知道每次多线程访问该方法时都会创建一个

SqlConnection
对象,也想知道这个方法和
SqlConnection
类是线程安全的。

public DataSet GetData( string deptId)
{
    using(SqlConnection con = new SqlConnection(connectionString))
    {
        using(SqlDataAdapter da = new SqlDataAdapter(
            "Select * FROM Employee where DeptId='"+deptId+"'",con))
        {
            DataSet ds = new DataSet();
            da.Fill(ds);
            return ds;
        }
    }
}
c# multithreading ado.net thread-safety sqlclient
2个回答
0
投票

SqlConnection
不是线程安全的,这意味着该类的实例不能在没有同步的情况下被多个线程同时使用。

尽管如此,

GetData
方法是线程安全的,因为每次调用它时都会创建一个单独的
SqlConnection
实例。这个
SqlConnection
对象仅由当前线程使用,不被任何其他代码共享。因此,您可以从任意多个线程中同时调用
GetData
方法,而无需使用
lock
语句或任何其他形式的同步。

需要注意的是,

SqlConnection
不是线程安全的,这并没有什么特别的。绝大多数内置 .NET 类都不是线程安全的。默认情况下是非线程安全的。少数线程安全的 .NET 类(例如
System.Collections.Concurrent
命名空间中的集合)已明确记录为线程安全的。如果您正在查看某个类的文档,但没有找到任何与线程安全相关的内容,那么您应该假设该类不是线程安全的。


-3
投票

根据您提供的代码,它似乎是安全的,因为连接将在使用后正确关闭。但需要注意的是,多线程环境下不能并发请求。

建议根据实际情况具体分析。官方指南指出,连接到数据库服务器通常涉及几个耗时的步骤,例如建立物理通道(例如套接字或命名管道)、与服务器执行初始握手、解析连接字符串信息、验证与服务器的连接,以及运行事务登记检查以及其他任务。

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