对象池与连接池

Rit*_*itu 6 connection-pooling object

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

请帮我澄清上面的内容。

ric*_*chj 3

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

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

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

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

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

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

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

一个简单的对象池示例

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

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

如果池已达到 maximum_size,则它无法增加池的大小,因此它必须以不同的方式处理客户端 - 假设它抛出 ObjectPoolExhausted 异常。

过了一会儿,一些客户端将对象返回到池中,并且它可以照常进行,直到再次耗尽对象。

回到问题

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

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