6

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

// Connection pooling.
using (var connection = CreateConnection())
{
    connection.ConnectionString = ConnectionString;
    connection.Open();

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

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

4

4 回答 4

8

这是一个值得商榷的话题,并且会发现许多博客会告诉我们为什么使用 Pool。

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

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

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

于 2012-11-06T10:29:34.237 回答
6

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

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

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

于 2012-11-06T10:26:12.953 回答
4

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

using mini-pattern 也非常适合确保及时关闭连接,这将结束连接上的任何事务,从而确保释放事务占用的任何锁。这可以极大地帮助提高性能,并最大限度地减少死锁的可能性。

于 2012-11-06T10:30:44.767 回答
2

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

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

伪代码...

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

<user interaction with data ...>

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

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

于 2012-11-06T10:29:02.267 回答