ADO.NET 的多线程
Multithreading with ADO.NET
我想select 同时从表中获取一些数据。当我尝试使用并行线程执行此操作时,会发生异常。我应该为每个 SqlCommand
使用不同的 SqlConnection
对象还是有任何技术可以在多个线程之间共享相同的 SqlConnection
并同时执行多个 SqlCommand
无一例外。
SqlConnection connection = new SqlConnection("...")
connection.Open();
List<Task> tasks = new List<Task>();
for (int i = 0; i < 10; i++)
{
tasks.Add(Task.Run(() =>
{
var command = connection.CreateCommand();
command.CommandText = "select top 1 * from Persons";
var data = command.ExecuteReader();
while (data.Read())
{
Console.WriteLine($"{data[0]} {data[1]} {data[2]}");
}
}));
}
await Task.WhenAll(tasks);
connection.Close();
您需要为每个并发操作建立单独的连接。由于连接被池化和重用,你可以随意在你需要的范围内创建一个新的,并在最后关闭它(它返回到池中,实际上不是 closed) .
这是大多数(所有?)数据库服务器的 on-the-wire 协议的限制。
我想select 同时从表中获取一些数据。当我尝试使用并行线程执行此操作时,会发生异常。我应该为每个 SqlCommand
使用不同的 SqlConnection
对象还是有任何技术可以在多个线程之间共享相同的 SqlConnection
并同时执行多个 SqlCommand
无一例外。
SqlConnection connection = new SqlConnection("...")
connection.Open();
List<Task> tasks = new List<Task>();
for (int i = 0; i < 10; i++)
{
tasks.Add(Task.Run(() =>
{
var command = connection.CreateCommand();
command.CommandText = "select top 1 * from Persons";
var data = command.ExecuteReader();
while (data.Read())
{
Console.WriteLine($"{data[0]} {data[1]} {data[2]}");
}
}));
}
await Task.WhenAll(tasks);
connection.Close();
您需要为每个并发操作建立单独的连接。由于连接被池化和重用,你可以随意在你需要的范围内创建一个新的,并在最后关闭它(它返回到池中,实际上不是 closed) .
这是大多数(所有?)数据库服务器的 on-the-wire 协议的限制。