Лучший способ ограничить потоки в БД, позволяя увеличить максимальный поток - PullRequest
0 голосов
/ 14 марта 2019

Довольно нуб к C #.У меня есть 12 БД Oracle, с примерно 10000+ схемами на каждой.Я хочу запустить многопоточный процесс (скажем, запрос или скрипт) для каждой схемы.

Если я: ThreadPool.SetMaxThreads(100,<not really sure what to put here>), вполне вероятно, что я попаду в DB1 с 100 подключениями прямо из шлюза.

Я хочу распределить эту нагрузку до максимум 10 потоков /Соединения на БД за один раз, но возможность 100 работает в целом.Я знаю, что я не могу иметь ThreadPool1, Threadpool2 и т. Д.

Что будет лучшим способом справиться с этим?

Любое понимание приветствуется!--Thanks!

1 Ответ

0 голосов
/ 14 марта 2019

Эта настройка для ThreadPool вызовет 100 соединений, если вы «свободно» запустите 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, ожидая завершения пакета, прежде чем начинать новый до завершения.

...