#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.