连接池是一个包含连接对象的对象池。
“对象池让您控制使用的连接数,而不是连接池,其中您控制的是达到的最大数量。”
对象池允许应用程序限制同时使用的实例数。如果应用程序需要比限制更多的实例,则对象池必须决定如何处理该问题。有许多可能的策略:
- 返回 null
- 抛出异常
- 阻塞直到实例可用
- 增加池的大小
连接池是一个对象池,因此它需要做出完全相同的决定。
对象池(或连接池)的具体实现可以使用这些策略中的任何一种,或多种组合。
在我看来,引用的声明会误导人,除非谈论特定的实现。
一个简单的对象池示例
池具有一些配置参数。一个简单的池可能有一个最小大小和一个最大大小。当池第一次可用时,它将包含最小数量的对象。随着客户端请求这些对象,池将包含更少的未分配对象。当客户端将对象返回到池时,这个数字也可以增加。
在某些时候,池可能会达到没有未分配对象的状态,但一个或多个客户端请求一个对象。此时,只要池还没有达到最大大小,它就可以创建一些新对象并将它们添加到池中。现在,它可以将对象返回给客户端。
如果池已经达到了最大大小,它就不能增加池的大小,因此它必须以不同的方式处理客户端——假设它抛出一个 ObjectPoolExhausted 异常。
过一会儿,一些客户端将对象返回到池中,然后它可以像往常一样继续运行,直到再次用完对象。
回到问题
MSDN 文章说,它的特定对象池实现将增加池的大小,直到达到指定的最大值。当达到最大值时,与上面的示例不同,它不会抛出异常,而是使客户端等待,直到对象被返回到池中,然后将新返回的对象给等待的客户端。
MSDN 文章说,它的特定连接池实现没有最大大小参数——它将继续创建新连接以满足需求(最终它将达到某些系统限制,并且请求将以一种未指定的方式失败)。