【发布时间】:2021-07-14 05:54:32
【问题描述】:
我尝试向我的 SQL Server 插入大量数据而未达到最大连接数。
我已经尝试在我的连接字符串中最大化池大小,如下所示:
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Echo;Max Pool Size=5000;Pooling=True;");
是否可以为每个线程使用一个连接?
这是我的代码
public static void GenerateMeridien()
{
List<Parallele> paralleleList = null;
using (var context = new EchoContext())
{
paralleleList = context.Paralleles.ToList();
}
foreach (Parallele parallele in paralleleList)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(MeridienTaskCallback), parallele);
}
}
private static void MeridienTaskCallback(object paralleleObj)
{
Parallele parallele = (Parallele)paralleleObj;
// The context always reaches maximum connection because the garbage collector is not fast enough
using (var context = new EchoContext())
{
List<Square> squareList = SquareLogic.GenerateSquare(parallele);
context.Squares.AddRange(squareList);
context.SaveChanges();
Console.Write("*");
}
}
【问题讨论】:
-
正确使用
IDisposable(通常通过using)否定“垃圾收集器未运行”。究竟是什么连接(暂时)泄漏? -
请提供一些数字:数据量、频率等。
-
@tymtam 在他的回答中提到的问题是您的代码试图同时并行运行所有插入。解决方案是在任何时候简单地限制工人的数量。
-
顺便说一句,您根本没有理由使用多线程。如果你切换到异步/等待,你将能够运行这个“单线程/异步/并发”。
-
获取适当的 BulkCopy 库并在一批中插入所有内容。
标签: c# sql-server multithreading entity-framework-core threadpool