Лучший способ ограничить потоки базой данных, разрешив больший максимальный поток

#c# #multithreading #oracle #threadpool

#c# #многопоточность #Oracle #threadpool

Вопрос:

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

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

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

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

Любая информация приветствуется! —Спасибо!

Комментарии:

1. Количество потоков в ThreadPool не определяет, сколько одновременной работы вы выполняете. Почему бы не создать класс для каждой базы данных, а затем обработать, сколько одновременных подключений там используется?

2. @Zer0 — Вероятно, в этом корень моей проблемы. Я не знаю, как ограничить потоки за пределами пула потоков. Что помешало бы классу DB1 сжечь выделение? Продолжая поиск, я нашел это (которое я сейчас читаю:) albahari.com/threading/#_Thread_Pooling Возможно, скоро я получу лучшее представление об этом. Спасибо за ответ!

Ответ №1:

Этот параметр для ThreadPool вызовет 100 подключений, если вы «запустите» 100 потоков свободно, и потоки начнут выполнять работу с вашей базой данных почти мгновенно.

Одним из способов ограничить количество параллельных потоков, выполняющих работу, является использование Parallel.ForEach или Parallel.Поскольку они предоставляют параметр 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, ожидая завершения пакета, прежде чем запускать новый до завершения.

Комментарии:

1. ХМмм .. я изучу это дальше. Может ли это потенциально замедлить работу? Если из 10 один большой, будет ли этот пакет ждать, пока все 10 не будут завершены, прежде чем переходить к следующему пакету? Спасибо!

2. Да, пока не будет завершен полный пакет, вы не начнете новый, это все равно что создать вручную 10 задач и использовать WaitAll для их завершения, прежде чем создавать еще 10.