【发布时间】:2024-01-23 21:35:01
【问题描述】:
对象池和连接池的确切区别是什么?他们利用内存的算法有什么不同吗? msdn 说“对象池允许您控制使用的连接数,而不是连接池,您可以控制达到的最大数量。” 这究竟是什么意思?
请帮我澄清一下。
【问题讨论】:
-
什么平台?什么语言?
对象池和连接池的确切区别是什么?他们利用内存的算法有什么不同吗? msdn 说“对象池允许您控制使用的连接数,而不是连接池,您可以控制达到的最大数量。” 这究竟是什么意思?
请帮我澄清一下。
【问题讨论】:
连接池是包含连接对象的对象池。
“对象池可让您控制使用的连接数,与连接池相反,您可以控制达到的最大数量。”
对象池允许应用程序在任何时候限制正在使用的实例数量。如果应用程序需要比限制更多的实例,对象池必须决定如何处理该问题。有多种可能的策略:
连接池是一个对象池,因此它需要做出完全相同的决定。
对象池(或连接池)的特定实现可以使用这些策略中的任何一种,或几种组合。
在我看来,引用的陈述具有误导性,除非它是在谈论具体的实现。
一个简单的对象池示例
池有一些配置参数。一个简单的池可能有一个 minimum_size 和一个 maximum_size。当池第一次可供使用时,它将包含 minimum_size 对象。当客户端请求这些对象时,池将包含更少的未分配对象。当客户端将对象返回到池中时,这个数字也会增加。
在某些时候,池可能会达到没有未分配对象的状态,但一个或多个客户端请求一个对象。此时,只要池还没有达到maximum_size,它就可以创建一些新的对象并将它们添加到池中。它现在可以将对象返回给客户端。
如果池达到maximum_size,它不能增加池的大小,所以它必须以不同的方式处理客户端——假设它抛出了一个ObjectPoolExhausted异常。
稍后,一些客户端将对象返回到池中,它可以照常进行,直到再次用完对象。
回到问题
MSDN 文章说其具体的对象池实现会将池的大小增加到指定的最大值。当达到最大值时,与上面的示例不同,它不是抛出异常,而是让客户端等待,直到一个对象返回到池中,然后将新返回的对象交给等待的客户端。
MSDN 文章说它的特定连接池实现没有最大大小参数 - 它会不断创建新连接以满足需求(最终它会达到某些系统限制并且请求会以某种方式失败指定)。
【讨论】: