1

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

在一般情况下,我们使用什么来池化任意对象,是否有已实现的解决方案(即对象,而不是接口)来痛苦地处理任务?

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

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

4

2 回答 2

1
  1. 对于通用对象池,您有一个Apache Commons 项目
  2. 对于测试会话是否存在,有不同的方法,但其中许多是不可靠的。可靠的(对 进行查询dual)很慢。您可以查看c3p0,它内置了该功能。
  3. 只要您的许多 webapps 在同一个 WAR 文件中,我认为您可以使用这个静态池对象。尽管就个人而言,我更喜欢单例而不是具有实用方法和常量以外的静态对象。

总的来说,我是...的忠实拥护者Hibernate……您是否考虑过将其用于您的应用程序?您仍然可以通过它进行简单的 SQL 查询,它会为您处理池和缓存。

于 2010-02-17T08:32:43.007 回答
1

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

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

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

于 2010-02-17T11:44:12.560 回答