为啥要使用连接池?

Posted

技术标签:

【中文标题】为啥要使用连接池?【英文标题】:Why should I use connection pooling?为什么要使用连接池? 【发布时间】:2012-10-26 06:47:18 【问题描述】:

在我的 C# 应用程序中,我连接到 mysql 数据库并运行 10,000 个查询。如果我保持与数据库的连接,这些查询大约需要 14 秒。但是,如果我依赖连接池,我的查询大约需要 15 秒。 (我已经多次运行此测试。)

// Connection pooling.
using (var connection = CreateConnection())

    connection.ConnectionString = ConnectionString;
    connection.Open();

网络上的大多数示例都使用上面的“连接和关闭”结构。但是,似乎连接池比保持连接慢。所以问题是……

问:为什么要使用连接池?

【问题讨论】:

我不明白,14秒比15秒快,不是吗? 您刚刚说过,使用连接池,您的查询需要 14 秒或 15 秒。这怎么“慢”? 呃,14 秒 15 岁以上几乎没有什么。 【参考方案1】:

问:为什么要使用连接池?

通常这样您就可以一次使用多个连接。这对于 Web 应用程序显然很重要 - 您不希望一个用户查询必须等待另一个用户的查询完成。

如果您正在编写一个直接与数据库对话的胖客户端应用程序,并且您知道一次只会执行一个查询,那么它不太重要 - 但它仍然是全局状态,这往往是你应该避免的事情。您正在做几件独立的事情 - 为什么要想要约束它们使用相同的连接?

【讨论】:

如果您在一个网站上有 2 个用户,他们不会都有自己的线程,如果该线程打开与数据库的连接,那么无论连接如何,他们都不会获得新连接汇集?你能解释一下为什么必须等待其他用户的查询完成吗? @Greg:OP 谈到:“如果我保持与数据库的连接,这些查询大约需要 14 秒。”换句话说,不是为每个请求创建一个连接,而是为整个应用程序保持一个单个连接。他们可能会为每个线程使用一个打开的连接,但在现代 Web 框架中,考虑到异步操作,我也不会假设请求始终在单个线程上执行......【参考方案2】:

如果您的应用程序所做的只是运行 10,000 个查询,然后在没有任何用户交互的情况下再次关闭,那么使用单个连接就可以了。

但是,当您的应用程序只是坐在那里等待用户输入时,保持数据库连接打开通常不是一个好主意。这是适合连接池的地方。

伪代码...

<open connection>
<fetch data>
<close connection>

<user interaction with data ...>

<open connection>
<save updated data>
<close connection>

根据使用的语言/数据库,将从连接池中生成第二个连接。

【讨论】:

【参考方案3】:

这是一个值得商榷的话题,很多博客都会告诉我们为什么要使用 Pool。

它不会减慢速度。在连接数据库服务器和握手以及建立客户端和数据库服务器之间的通信上花费了大量时间。

因此,在服务器处理许多请求的多请求范例中,很难建立并等待每个客户端。 POOL 帮助我们,它为我们提供了预先准备好的连接,我们使用它并丢弃它。 POOL 获取该连接并为下一个请求重新建立它。

但在单线程环境中,情况正好相反。对于单线程环境,POOL 将是一个非常繁重的资源。

【讨论】:

我认为你的最后一句话很到位。【参考方案4】:

连接池非常适合可扩展性 - 如果您有 100 个线程/客户端/最终用户,每个线程/客户端/最终用户都需要与数据库通信,那么您不希望它们都打开到数据库的专用连接(连接是昂贵的资源),而是共享连接(通过池)。

使用迷你模式也非常适合确保及时关闭连接,这将结束连接上的任何事务,从而确保释放事务占用的任何锁。这对性能有很大帮助,并且可以最大限度地减少死锁的可能性。

【讨论】:

以上是关于为啥要使用连接池?的主要内容,如果未能解决你的问题,请参考以下文章

数据库连接池为啥要用 ThreadLocal?

数据库连接池为啥要用 ThreadLocal?

数据库连接池为啥要用 ThreadLocal?

为啥HikariCP被号称为性能最好的Java数据库连接池,如何配置使用

数据库连接池为啥要用 ThreadLocal?

Hibernate:啥是连接池,为啥默认的连接池不适合生产?