【问题标题】:Good technique for connections with PostgreSQL与 PostgreSQL 连接的好技术
【发布时间】:2023-03-29 23:19:01
【问题描述】:

我正在使用 Npgsql 通过 .NET 访问 PostgreSQL。我担心执行与数据库的连接的正确方法,因为在我看来,每次我想要执行某些事务时打开连接然后关闭它是一项昂贵的操作。

所以这是大体思路:

public class PostgreSQL
{
    private NpgsqlConnection conn; // <- one connection for this object, open all the time

    public PostgreSQL(string connString)
    {
        conn = new NpgsqlConnection(connString);
        conn.Open();
    }

    // ...here making some queries...

    public void Close() => conn.Close(); // <- use this in the very end of the program
}

正如您在上面看到的,我有一个PostgreSQL 类实例的连接。

我的问题

这种方法对吗?还是应该在每次进行交易时打开和关闭连接 - 尽可能晚地打开并尽快关闭?

如果我应该每次都打开和关闭连接 - 我应该编写一个限制并发连接数量的队列吗?或者 PostgreSQL 会自己处理——理论上,我可以打开 200 个连接就可以了。

请与我分享你的经验^^

编辑: 我将每秒运行 100-200 个查询。

【问题讨论】:

  • 您可能应该添加查询数据库的频率。
  • @JakubKania 刚刚添加,每秒 100-200 个查询。
  • Npgsql 具有内置的连接池,因此无论您如何进行查询,即使您调用Close()Open(),连接也不会完全关闭和打开。但它是桌面应用程序吗?查询是并发的吗?
  • 您是否运行过任何性能跟踪来查看这是否真的是一个问题?大多数提供商都进行连接池。如果您的使用不是同步的,您可能会饿死池,但您应该始终进行适当的性能测试,而不是假设一种方式比另一种方式更好。默认情况下,我倾向于迟到早关,而且我从未注意到此代码出现在热门曲目中。

标签: c# .net postgresql theory


【解决方案1】:

PostgreSQL 支持连接池(池大小为customizable)所以常见模式:

using (NpgsqlConnection conn = new NpgsqlConnection(...))
{
...
}

应该是更好的选择。

【讨论】:

    【解决方案2】:

    在我看来,您应该在需要的时候打开一个连接,然后在它之后立即关闭它。这将阻止服务器上的大量连接保持活动状态。

    根据我的经验,打开连接不会花费太多时间(几毫秒,通常只是执行时间的一小部分),因此您不必太担心。

    【讨论】: