2015-06-15 2 views
1

Я использую Npgsqlconnection внутри Parallel.ForEach, перебирая встроенные запросы в список.Parallel.ForEach с помощью NpgsqlConnection

Когда я достигаю число вокруг 1400+ я получаю исключение, говоря

'FATAL: 53300: остальные слоты подключения зарезервированы для подключения суперпользователя без репликации.

Я использую

Pooling=true;MinPoolSize=1;MaxPoolSize=1024;ConnectionLifeTime=1 

в моем app.config и con.Close(), con.ClearPool(), con.Dispose() в моем коде.

Parallel.ForEach (запросы, запрос => { использованием (NpgsqlConnection CON = новый NpgsqlConnection (ConfigurationManager.ConnectionStrings [ "PSQL"] ConnectionString)) { con.ClearPool();. ( con.Open);

     //int count = 0; 
         int queryCount = queries.Count; 

         using (NpgsqlCommand cmd = con.CreateCommand()) 
         { 
          cmd.CommandType = CommandType.Text; 
          //cmd.CommandTimeout = 0; 

          cmd.CommandText = query; 
          cmd.ExecuteNonQuery(); 

          count += 1; 
          this.label1.Invoke(new MethodInvoker(delegate { this.label1.Text = String.Format("Processing...\n{0} of {1}.\n{2}% completed.", count, queryCount, Math.Round(Decimal.Divide(count, queryCount) * 100, 2)); }));         
         } 

         con.Close();        
         //con.Dispose(); 
         //con.ClearPool(); 
        }      
       }); 
+0

Не могли бы вы отправить код, вызывающий проблему? Без этого вам трудно помочь. – svick

ответ

0

Вы ударяют предел макс подключения самого PostgreSQL:

http://www.postgresql.org/docs/9.4/static/runtime-config-connection.html#GUC-MAX-CONNECTIONS

Ваши параллельные запросы получают много соединений, и сервер не справляется с этим. По умолчанию Postgresql настроен на 100 одновременных подключений. Возможно, вам стоит попытаться увеличить это значение в файле postgresql.conf.

Другим вариантом является ограничение размера пула Npgsql на меньшее число. Ваши параллельные запросы будут ждать, когда достигнут максимальный размер пула.

Кроме того, не вызывайте ClearPool, так как вы добавите накладные расходы в логику пула и вообще не получите выгоду от пула. Вместо этого вы можете попробовать установить Pool=false в свою строку подключения.

Надеюсь, это поможет.

Смежные вопросы