对象池:howto

时间:2010-02-17 08:00:53

标签: java pooling object-pooling

我需要实现一个由外部系统返回的Sessions池, 这样我就可以在需要时尽快重复使用它们(创建一个会话需要一段时间)。 我使用数据源来创建一个数据库连接池(来自Apache的DBCP),它就是 已实施的解决方案。

我们在一般情况下使用什么来汇集任意对象,是否实现了解决方案,即对象,而不是接口,以便痛苦地处理任务?

第二个问题是,我们如何测试Session是否还活着?是否有一个特定的方法,我们在对象池中覆盖,查询Session自己的方法?

第三个非常重要的问题是,对象池对象是否应该是静态的?我从系统中提取的一组对象必须在不同的Web应用程序之间共享。所以,比方说,我们提取5个会话。 App A查询POOL并获取第一个可用的Session。现在剩下4场比赛了。另一个应用程序B启动并查询相同的池。等池共享。在同一个Web应用程序的不同实例中,在同一台计算机上运行。

2 个答案:

答案 0 :(得分:1)

  1. 对于通用的对象池, 你有一个Apache Commons project
  2. 进行测试 会话还活着,有 不同的方式,但其中许多是 不可靠的。而且可靠的一个 (对dual进行查询)很慢。 你可以看一下c3p0, 内置了该功能。
  3. 只要您的许多Web应用程序位于同一个WAR文件中,我认为您可以使用此静态池对象。虽然,就个人而言,我更喜欢单一的静态对象,而不仅仅是实用方法和常量。
  4. 一般来说,我是Hibernate的忠实粉丝......您是否考虑过将它用于您的应用程序?您仍然可以通过它进行纯SQL查询,并为您处理池化和缓存。

答案 1 :(得分:1)

如果您使用的是J2EE应用程序服务器,请考虑构建实现Java Connector Architecture(JCA)的组件。组件的每个实例都访问一个会话,您将容器配置为最多创建五个(来自您的示例)实例。容器管理池和组件的生命周期。此外,部署在该应用程序服务器上的所有应用程序共享组件的池。

如果我没记错(它已经有一段时间了),还有一种方法可以向容器发出一个实例死亡的信号。在这种情况下,容器会删除死实例并实例化一个新实例。

某些非J2EE应用程序服务器支持JCA组件,因此即使您没有使用传统的J2EE容器也要检查它。