对象池与连接池

6
对象池和连接池有什么确切的区别?它们在利用内存方面的算法是否有差异? MSDN称:“对象池使您能够控制使用的连接数,而不是连接池,其中您控制达到的最大数量。” 这究竟意味着什么? 请帮我澄清以上内容。

什么平台?什么语言? - Oded
1个回答

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

感谢您的回答,Richj。我仍然感到困惑。MSDN 中的另一条声明是:“在使用连接池时,创建在同一线程上进行,因此如果池中没有任何内容,则会代表您创建一个连接。使用对象池时,池可以创建一个新对象。但是,如果您已经达到了最大值,它将给您提供下一个可用的对象。当创建对象需要很长时间时,这是至关重要的行为,但不要长时间使用它。” Richj,如果您曾经实现过这些功能,请告诉我它们之间的确切区别。 - Ritu
嗨Ritu。请发布MSDN文章的链接。我认为它正在谈论特定的实现。当应用于对象和连接池的一般情况时,这些语句是不正确的。 - richj
感谢您的回复,MSDN链接为http://msdn.microsoft.com/zh-cn/library/ff7105zk(VS.80).aspx - Ritu
该文章讨论了对象池和连接池模式的具体实现:COM+对象池服务和.NET Framework数据提供程序的连接池。 - richj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接