Дано: есть база данных на PostgreSQL, в который есть 2 хранимые процедуры. Есть консолька на C# с драйвером Npgsql. В консольке надо создать 1000 потоков, каждый из которых имеет своё соединение и вызывает эти самые хранимки. Вызываю потоки и запрос следующим образом:
new Thread(() =>
{
Thread.CurrentThread.IsBackground = true;
for (var i = 0; i < 500; i++) {
try {
var thread = new Thread(() =>
{
Console.WriteLine($"Running thread: {Thread.CurrentThread.ManagedThreadId}");
SaveByteA(connectionString);
var a = 2 + 4;
}) {IsBackground = true,Priority = ThreadPriority.AboveNormal};
thread.Start();
}
catch (Exception e) {
Console.WriteLine(e);
throw;
}
}
Console.WriteLine("Finished Thread #1.");
})
{ IsBackground = true, Priority = ThreadPriority.Highest }.Start();
new Thread(() =>
{
Thread.CurrentThread.IsBackground = true;
for (var i = 0; i < 500; i++)
{
try {
var thread = new Thread(() =>
{
Console.WriteLine($"Running 2 thread: {Thread.CurrentThread.ManagedThreadId}");
SaveByteB(connectionString);
})
{ IsBackground = true, Priority = ThreadPriority.AboveNormal };
thread.Start();
}
catch (Exception e) {
Console.WriteLine(e);
throw;
}
}
Console.WriteLine("Finished Thread #2.");
}) { IsBackground = true, Priority = ThreadPriority.Highest}.Start();
Надо: Сделать столько запросов (то бишь потоков), чтобы одновременное количество соединённых клиентов с выполняющимися транзакциями было примерно ~1000.
Проблема :когда запускаю консольку с малым количеством потоков, то всё обрабатывается быстро -- БД очень мощная, поэтому результат в ~1000 соединении и обрабатываемых транзакции пропадает. А когда ставлю большое количество потоков, то получаю SocketException -- соединение было прервано насильно удалённым хостом. (Приём консколька жалуется на базу, а база на клиент. кто прав -- не пойму).
В чём моя проблема? Куда копать? Есть лучше варианты работы с потоками или варианты нагрузки базы так, как написано в условии?