【问题标题】:object pool vs connection pool对象池与连接池
【发布时间】:2024-01-23 21:35:01
【问题描述】:

对象池和连接池的确切区别是什么?他们利用内存的算法有什么不同吗? msdn 说“对象池允许您控制使用的连接数,而不是连接池,您可以控制达到的最大数量。” 这究竟是什么意思?

请帮我澄清一下。

【问题讨论】:

  • 什么平台?什么语言?

标签: object connection-pooling


【解决方案1】:

连接池是包含连接对象的对象池。

“对象池可让您控制使用的连接数,与连接池相反,您可以控制达到的最大数量。”

对象池允许应用程序在任何时候限制正在使用的实例数量。如果应用程序需要比限制更多的实例,对象池必须决定如何处理该问题。有多种可能的策略:

  • 返回空值
  • 抛出异常
  • 阻塞直到实例可用
  • 增加池的大小

连接池是一个对象池,因此它需要做出完全相同的决定。

对象池(或连接池)的特定实现可以使用这些策略中的任何一种,或几种组合。

在我看来,引用的陈述具有误导性,除非它是在谈论具体的实现。

一个简单的对象池示例

池有一些配置参数。一个简单的池可能有一个 minimum_size 和一个 maximum_size。当池第一次可供使用时,它将包含 minimum_size 对象。当客户端请求这些对象时,池将包含更少的未分配对象。当客户端将对象返回到池中时,这个数字也会增加。

在某些时候,池可能会达到没有未分配对象的状态,但一个或多个客户端请求一个对象。此时,只要池还没有达到maximum_size,它就可以创建一些新的对象并将它们添加到池中。它现在可以将对象返回给客户端。

如果池达到maximum_size,它不能增加池的大小,所以它必须以不同的方式处理客户端——假设它抛出了一个ObjectPoolExhausted异常。

稍后,一些客户端将对象返回到池中,它可以照常进行,直到再次用完对象。

回到问题

MSDN 文章说其具体的对象池实现会将池的大小增加到指定的最大值。当达到最大值时,与上面的示例不同,它不是抛出异常,而是让客户端等待,直到一个对象返回到池中,然后将新返回的对象交给等待的客户端。

MSDN 文章说它的特定连接池实现没有最大大小参数 - 它会不断创建新连接以满足需求(最终它会达到某些系统限制并且请求会以某种方式失败指定)。

【讨论】:

  • 感谢您的回答 Richj。我仍然很困惑。msdn 中的另一个语句说“使用连接池时,创建是在同一个线程上,所以如果池中没有任何内容,则创建一个连接代表您。使用对象池,池可以创建一个新对象。但是,如果您已经达到最大值,它会为您提供下一个可用对象。当创建对象需要很长时间时,这是至关重要的行为,但不要长时间使用它。” Richj 如果你曾经实现过这些,请告诉它们到底有什么不同。
  • 嗨瑞图。请发布指向 MSDN 文章的链接。我认为这是在谈论具体的实现。这些语句在一般情况下应用于对象池和连接池时是不正确的。
  • 这篇文章讲的是对象池和连接池模式的具体实现:COM+ Object Pooling Service and Connection Pooling for the .NET Framework Data Provider for