Parallel.ForEach с помощта на NpgsqlConnection

Използвам Npgsqlconnection вътре в Parallel.ForEach, преминавайки през вградени заявки в списък.

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

„ФАТАЛНО: 53300: оставащите слотове за връзка са запазени за връзки на суперпотребител без репликация“.

Използвам

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

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

Parallel.ForEach(queries, query => { 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