将线程限制为数据库同时允许更大的最大线程的最佳方法
Best way to limit threads to a DBs while allowing a larger max thread
C# 相当菜鸟。我有 12 个 Oracle 数据库,每个数据库大约有 10000 多个模式。
我想 运行 跨每个模式的多线程进程(比如查询或脚本)。
如果我:ThreadPool.SetMaxThreads(100,<not really sure what to put here>)
,我很可能一开始就用 100 个连接访问 DB1。
我想将负载分散到每个 DB 一次最多 10 threads/connections,但总体上可能达到 100 运行ning。我知道我不能有 ThreadPool1、Threadpool2 等
处理该问题的最佳方法是什么?
任何见解表示赞赏! --谢谢!
如果您 'start' 松散地使用 100 个线程,那么对 ThreadPool 的设置将导致 100 个连接,并且线程将几乎立即开始对您的数据库执行工作。
限制并行线程数量的一种方法是使用 Parallel.ForEach 或 Parallel.For,因为它们提供了一个 ParallelOptions 参数,您可以在其中设置最大并行度:
Parallel.ForEach<string>(rows, new ParallelOptions() { MaxDegreeOfParallelism = batchSize},(row) => {
// your code here
} );
Parallel.For(0,100, new ParallelOptions() { MaxDegreeOfParallelism = batchSize }, i => {
//your code here
});
MaxDegreeOfParallelism 会将并发工作限制为 batchSize 值,等待批处理完成后再开始新的直到完成。
C# 相当菜鸟。我有 12 个 Oracle 数据库,每个数据库大约有 10000 多个模式。 我想 运行 跨每个模式的多线程进程(比如查询或脚本)。
如果我:ThreadPool.SetMaxThreads(100,<not really sure what to put here>)
,我很可能一开始就用 100 个连接访问 DB1。
我想将负载分散到每个 DB 一次最多 10 threads/connections,但总体上可能达到 100 运行ning。我知道我不能有 ThreadPool1、Threadpool2 等
处理该问题的最佳方法是什么?
任何见解表示赞赏! --谢谢!
如果您 'start' 松散地使用 100 个线程,那么对 ThreadPool 的设置将导致 100 个连接,并且线程将几乎立即开始对您的数据库执行工作。
限制并行线程数量的一种方法是使用 Parallel.ForEach 或 Parallel.For,因为它们提供了一个 ParallelOptions 参数,您可以在其中设置最大并行度:
Parallel.ForEach<string>(rows, new ParallelOptions() { MaxDegreeOfParallelism = batchSize},(row) => {
// your code here
} );
Parallel.For(0,100, new ParallelOptions() { MaxDegreeOfParallelism = batchSize }, i => {
//your code here
});
MaxDegreeOfParallelism 会将并发工作限制为 batchSize 值,等待批处理完成后再开始新的直到完成。