我为什么要使用连接池?

时间:2012-11-06 10:21:55

标签: c# mysql connection-string connection-pooling

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

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

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

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

4 个答案:

答案 0 :(得分:6)

  

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

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

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

答案 1 :(得分:4)

这是一个很有争议的话题,并且会发现很多博客会告诉我们为什么要使用Pool。

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

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

但是在单线程环境中,它是另一种方式。对于单线程环境,POOL将是一个非常重的资源。

答案 2 :(得分:3)

如果您的所有应用程序都运行了10,000个查询,然后再次关闭而没有任何用户交互,则可以使用单个连接。

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

伪代码......

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

<user interaction with data ...>

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

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

答案 3 :(得分:3)

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

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