Parallel.ForEach с использованием NpgsqlConnection

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

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

«FATAL: 53300: оставшиеся разъемы для подключения зарезервированы для подключений суперпользователя без репликации».

Я использую

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

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

Parallel.ForEach (запросы, запрос => {using (NpgsqlConnection con = new 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();
                    }                    
                });

person SajmiraZ    schedule 15.06.2015    source источник
comment
Не могли бы вы опубликовать код, вызывающий проблему? Без этого тебе трудно помочь.   -  person svick    schedule 15.06.2015


Ответы (1)


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

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

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

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

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

Я надеюсь, что это помогает.

person Francisco Junior    schedule 22.06.2015