2011-01-04 1 views
1

У меня есть ошибка «Слишком много клиентов уже» в C# и PostgreSQL Я сделал что-то не так?Слишком много клиентов уже в C# и PostgreSQL

это мой основной код

public class NationalService 
{ 
    private NpgsqlConnection conn; 
    protected string query; 
    public NationalService() 
    { 
     this.conn = ConnectionService.GetConnection(); 
    } 

    public string GetNamaWilayah(string kodePropinsi, string kodeKabupaten) 
    { 
     this.query = "select namakabupaten from dim_gab_wilayah where kodepropinsi='" + kodePropinsi + "' and kodekabupaten='" + kodeKabupaten + "' group by namakabupaten"; 
     string namaKabupaten; 
     using (NpgsqlCommand command = new NpgsqlCommand(this.query, this.conn)) 
     { 
      using (NpgsqlDataReader dr = command.ExecuteReader()) 
      { 
       while (dr.Read()) 
       { 
        namaKabupaten = dr["namakabupaten"].ToString(); 
        return namaKabupaten; 
       } 
      } 
     } 
     return string.Empty;   
    } 

}

и это, как я получаю соединение

public class ConnectionService 
{ 
    public static NpgsqlConnection GetConnection() 
    { 
     string connStr = WebConfigurationManager.ConnectionStrings["local"].ConnectionString; 
     NpgsqlConnection conn = new NpgsqlConnection(connStr);    
     conn.Open(); 
     return conn; 
    } 
} 

Я `t didn написать что-то вроде conn.Close(); но я был написан conn.Open в использовании.

Для временного я изменил max_connections = от 100 до 1000 в postgresql.conf

вы можете дать мне намек?

Thanks in Advance

+0

Возможно оптимизация: используйте [ExecuteScalar] (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx) вместо ExecuteReader + цикл while, который возвращает первое значение. –

ответ

2

Вы никогда не закрываете свое соединение. Это проблема. Каждый запрос открывает новое соединение. Вот почему вы получаете ошибку «слишком много клиентов уже».

Я не писал ничего подобного conn.close(); но я написал conn.Open при использовании.

Conn.open не имеет никакого отношения к использованию. Если вы создаете свое соединение внутри, то это может быть полезно. Даже он только вызывает dispose().

Так что лучше закрыть соединение после операции, то есть возобновленный способ.

1

Я ничего не знаю о C#, но вы должны окончательно закрыть соединение после его использования. Можете ли вы проверить, что вызов вашей функции для 100-го (1000-го) времени вызывает ошибку «слишком много соединений»? Я бы рекомендовал вам использовать «шаблон аренды» здесь. Как правило, это помогает вам очищать ресурсы после их использования. Spring.NET может предложить именно то, что вам нужно.

4

Вы создаете новое соединение с сервером, когда создается новый экземпляр класса NationalService, но эти соединения никогда не закрываются. Вам нужно добавить чистый класс к классу, который будет вызываться непосредственно перед уничтожением экземпляра. В этом методе вы должны освободить соединение, вызвав метод close().

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

Я не C# разработчик, но разработчик Java.

В Точно так же проверьте DataReader вы используете также должны ли быть закрыты.

Я настоятельно рекомендую вам использовать соединение объединив библиотеку в развертывании производства вместо того, чтобы создавать и поддерживать МАГИСТРАЛИ себя.

+0

В .Net есть автоматическое объединение пулов: закрытие соединения возвращает его в пул. Но да, вам все равно нужно закрыть его. –

+0

@ Спасибо Спасибо за информацию. –

+0

спасибо за ответ .. но можете ли вы привести пример, где я ставлю conn.Close()? То, что вы имели в виду, это поставить Conn.close() перед Conn.open()? –

2

Внесите свой код, чтобы при использовании объявления объявлялось соединение вместо команды. Таким образом, он будет удален сразу после выхода из блока использования.