2016-06-06 4 views
0

При вставке данных в базу данных с помощью параллельно foreach я получаю следующее сообщение об ошибке:Бассейн соединение исчерпано

The connection pool has been exhausted'

после вставки некоторого количества данных в базу данных

try 
{ 
    var connection = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString; 

    Parallel.ForEach(Enumerable.Range(0, 1000), (_) => 
    { 
     using (var connectio = new NpgsqlConnection(connection)) 
     { 
      connectio.Open(); 
      using (var command = new NpgsqlCommand("fn_tetsdata", connectio) { CommandType = CommandType.StoredProcedure }) 
      { 
       command.Parameters.AddWithValue("firstname", "test"); 
       command.Parameters.AddWithValue("lastname", "test"); 
       command.Parameters.AddWithValue("id", 10); 
       command.Parameters.AddWithValue("designation", "test"); 

       command.ExecuteNonQuery(); 
      } 
      connectio.Close(); 
     } 
    }); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.Message); 
} 
+1

Размер пула подключения по умолчанию равен 20, поэтому либо увеличьте его, либо уменьшите количество подключений. –

+2

Мне просто интересно, почему бы вам так поступить ... Вы понимаете, что обычно лучше делать большую работу в одной партии, а не бросать много потоков, которые подключаются, выполнять немного работы, отключать , и т.д? – atlaste

+0

Я не уверен, что размер пула по умолчанию равен 20 - http://stackoverflow.com/questions/18943703/how-many-threads-parallel-forforeach-will-create-default-maxdegreeofparalleli –

ответ

4

Ограничить количество parralelism с MaxDegreeOfParallelism, по умолчанию он может превышать количество подключений DB, которые у вас есть. Найдите баланс между распараллеливанием работы, а не убийством БД :)

Parallel.ForEach(yourListOfStuff, 
    new ParallelOptions { MaxDegreeOfParallelism = 10 }, 
    stuff => { YourMethod(stuff); } 
); 
2

Я предполагаю, что вы используете параллельность для повышения производительности. Если это так, сначала вам нужна базовая линия. Запускайте 1000 запросов в последовательном порядке, каждый раз создавая новое соединение (которое на самом деле просто вытаскивает один из пула).

Тогда попробуйте с такой же объект подключения и посмотрите, улучшится ли производительность.

Затем попробуйте с помощью команды , просто изменив значения параметров.

Затем попробуйте параллельно с тем же соединением co Вы не создаете 1000 объектов соединения, которые вы уже пробовали.

Я был бы удивлен, если вы получили повышение производительности на значительного с помощью параллелизма, поскольку Parallel повышает производительность процессора переплетом задачи и запросы данных, как правило, гораздо больше связаны I/O, чем CPU.