2011-01-14 37 views
1

我需要池连接到某些资源。实际的资源对于这个讨论并不重要。但值得注意的是,这些连接并不是线程安全的,因此需要将连接池等作为一个昂贵的操作。是否有任何池中的解决方案,允许一个密钥传递到获取/采取方法

我最初的想法是为一个大池管理超时连接并杀死它们等等。然而,问题是每个连接可能包含一个不同的参数,因此在进行连接时需要传递参数并让池使用它试图找到具有相同值的连接。如果它(池)找不到对象,那么它需要创建一个实例来传递参数等。

但是Apache Commons Pools和其他类似的库没有为这种概念提供任何规定。有没有包含这种概念的图书馆?我想在Pool下面有一个实例列表,当一个请求进来时,它使用一些匹配器遍历它的可用对象并返回匹配的第一个。

请注意,不可能修改连接对象的参数,因此问题和问题原因被问到。

  • 有没有更好的方法来解决这个问题?
  • 有没有一个共享库,做到了上述?
  • 我应该写我自己的?
+0

为什么你就不能配置差异参数差异池。有一个门面可以访问所有这些泳池。如果外观知道给定的输入参数没有池,那么它将在飞行中创建一个 – 2011-01-14 03:04:57

+0

因为有太多不同的参数,这将意味着大量和大量的池。正如我在其他评论中提到的 - 我相信Apache公共池并不便宜,因为每个池都创建自己的清理线程。从我的快速查看来看,似乎并没有一种简单的方法让ACP共享清理线程,因此每个池创建或多或少都是一个廉价的队列,具有后台清理线程和生命周期管理功能。 – 2011-01-14 03:16:09

回答

1

为什么不用密钥先找到池?然后使用其中一种可用的解决方案。我不认为你会通过尝试将所有东西放在一起来简化任何事情,因为不同的键控项目不是交叉兼容的。

+0

因为遵循你的建议,大部分这些二级池中的大部分时间都会有一件物品。每个键可能只有一个实例,并且当前线程想要再次返回该连接的机会很小。然而,其他线程可能需要连接的可能性很小,因此实际需要进行池化。我不确定,但看起来创建Apache公共池并不便宜,因为我认为每个池都创建自己的清理池线程。 – 2011-01-14 03:13:26

0

如果对象不是线程安全的,为什么要合并?无论如何,您的池管理器将无法检查状态/从其他线程关闭它们。

只需在每个线程中使用ThreadLocal保留一个副本。

0

KeyedObjectPool就是答案,如果你想看到一个例子看看this

相关问题