【问题标题】:Too Many Clients Already in C# and PostgreSQLC# 和 PostgreSQL 中已经有太多客户端
【发布时间】:2011-01-04 09:30:40
【问题描述】:

我在 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 in using。

我在 postgresql.conf 中将 max_connections = 100 更改为 1000

你能给我提示吗?

提前致谢

【问题讨论】:

  • 可能是一种优化:使用ExecuteScalar 而不是 ExecuteReader + 返回第一个值的 while 循环。

标签: c# postgresql database-connection connection-pooling


【解决方案1】:

NationalService 类的新实例创建时,您正在创建到服务器的新连接,但这些连接永远不会关闭。你需要在类中添加一个干净的方法,该方法将在实例被销毁之前被调用,在这个方法中你必须通过调用 close() 方法来释放连接。

Too Many Clients Already”异常出现在要求服务器创建的连接数超过其配置维护的连接数的情况下。

我不是 C# 开发人员,而是 java 开发人员。

同样检查你正在使用的dataReader是否也需要关闭。

我强烈建议您在生产部署中使用连接池库,而不是自己创建和维护连接。

【讨论】:

  • .Net 中有一个自动连接池:关闭连接会将其返回到池中。但是,是的,您仍然需要关闭它。
  • 感谢您的回答..但是您能给我举个例子说明我在哪里放置 conn.Close() 吗?你的意思是我把 Conn.close() 放在 Conn.open() 之前?
  • 连接使用后必须关闭。这里由于连接是在创建NationalService 实例时创建的,因此您必须在对象被销毁之前关闭它。您可以在NationalService 类中编写一个名为close() 的方法,您可以在其中调用Conn.close(),然后在NationalService 实例被销毁之前调用实例中的close() 方法。
【解决方案2】:

重写您的代码,以便 Using 声明连接而不是命令。 这样它会在退出 using 块后立即处理。

【讨论】:

    【解决方案3】:

    你永远不会关闭你的连接。那就是问题所在。每个请求都会打开新连接。这就是您收到“Too Many Clients Already”错误的原因。

    我没有写类似的东西 conn.close();但我被写了 conn.Open in using。

    Conn.open 与使用无关。如果您在使用中创建连接,那么它可能会有所帮助。即使它只调用 dispose()。

    所以最好在操作后关闭你的连接,这是推荐的方式。

    【讨论】:

      【解决方案4】:

      我对C#一无所知,但你必须在使用后明确关闭连接。您能否验证第 100 次(第 1000 次)调用您的函数会产生“连接过多”错误?我建议您在这里使用“租赁模式”。通常,这可以帮助您在使用资源后清理资源。 Spring.NET 可能会提供您所需要的。

      【讨论】:

        猜你喜欢
        • 2012-10-06
        • 1970-01-01
        • 2012-12-12
        • 2011-02-14
        • 2012-04-05
        • 2018-06-20
        • 2012-01-17
        • 1970-01-01
        相关资源
        最近更新 更多