Слишком много клиентов уже в C # и PostgreSQL - PullRequest
1 голос
/ 04 января 2011

У меня ошибка "Слишком много клиентов уже" в 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;
    }
}

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

Для временных я изменил max_connections = 100 на 1000 в postgresql.conf

Можете ли вы дать мне подсказку?

Заранее спасибо

Ответы [ 4 ]

4 голосов
/ 04 января 2011

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

Too Many Clients Already "приходит, когда серверу предлагается создать больше соединений, чем настроено для обслуживания.

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

Таким же образом проверьте, является ли dataReaderвы также должны быть закрыты.

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

2 голосов
/ 04 января 2011

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

2 голосов
/ 04 января 2011

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

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

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

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

1 голос
/ 04 января 2011

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

...