对象池和连接池之间的确切区别是什么?他们利用内存的算法有什么不同吗?
msdn 说“对象池让你控制你使用的连接数,而不是连接池,你可以控制达到的最大数量。”
这究竟是什么意思?
请帮我澄清上面的内容。
最佳答案
连接池是包含连接对象的对象池。
"Object pooling lets you control the number of connections you use, as opposed to connection pooling, where you control the maximum number reached."
对象池允许应用程序在任何时候限制正在使用的实例数。如果应用程序需要的实例数超过限制,则对象池必须决定如何处理该问题。有多种可能的策略:
连接池是一个对象池,因此它需要做出完全相同的决定。
对象池(或连接池)的特定实现可以使用这些策略中的任何一种,或几种组合使用。
在我看来,所引用的声明具有误导性,除非它是在谈论具体的实现。
一个简单的对象池示例
池有一些配置参数。一个简单的池可能有一个 minimum_size 和一个 maximum_size。当池首次可供使用时,它将包含 minimum_size 对象。当客户端请求这些对象时,池将包含更少的未分配对象。当客户端将对象返回到池中时,这个数字也会增加。
在某些时候,池可能会达到一种状态,即它没有未分配的对象,但一个或多个客户端请求一个对象。此时,只要池没有达到maximum_size,它就可以创建一些新对象并将它们添加到池中。它现在可以将对象返回给客户端。
如果池已达到maximum_size,则无法增加池的大小,因此它必须以不同的方式处理客户端——假设它抛出一个 ObjectPoolExhausted 异常。
稍后,一些客户端将对象返回到池中,它可以照常进行,直到再次用完对象。
返回问题
MSDN文章说它的特定对象池实现会将池的大小增加到指定的最大值。当达到最大值时,与上面的例子不同,它不是抛出异常,而是让客户端等待,直到一个对象返回到池中,然后将新返回的对象交给等待的客户端。
MSDN 文章说其特定的连接池实现没有最大大小参数 - 它会不断创建新连接以满足需求(最终它会达到某个系统限制并且请求将以某种未指定的方式失败)。
关于对象池与连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3324351/