对象池:HOWTO

问题描述:

我需要实现由外部系统返回的会话池, 这样我就可以迅速只要一个需要(创建会话需要一段时间)重用他们。 我已经使用数据源创建了一个数据库连接池(来自Apache的DBCP),并且它是 一个实现的解决方案。对象池:HOWTO

我们在一般情况下,用什么来凝聚任意对象,以及是否有实现的解决方案,即对象,而不是接口,对付痛苦的任务是什么?

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

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

+1

如果你已经熟悉了下议院DBCP,那么这是基于共享池,这是一个通用对象池库。 – skaffman 2010-02-17 08:23:26

+0

@skaffman这可能是,但在这里我只看到一些什么也不做的实现http://commons.apache.org/pool/apidocs/org/apache/commons/pool/package-summary.html这还不够有效。有更具体的东西吗? – EugeneP 2010-02-17 08:46:02

+1

你需要扩展'BaseObjectPool',这很简单。你需要做一些*工作... – skaffman 2010-02-17 08:50:04

  1. 对于对象的通用池, 你有那一个Apache Commons project
  2. 对于测试 表示一个会话存在,有 不同的方式,但其中很多是 不可靠。而可靠的 (在dual上进行查询)很慢。 你可以看看c3p0, 它有内置的功能。
  3. 只要你的许多webapps在同一个WAR文件中,我想你可以使用这个静态池对象。尽管个人而言,我更喜欢单身人士比静态对象更多,而静态对象只有实用方法和常量。

一般来说,我是Hibernate的忠实粉丝......你有没有考虑过将它用于你的应用程序?您仍然可以通过它进行简单的SQL查询,并为您处理您的池和缓存。

+0

@mlaverd第3段 - 我稍微修改了我的问题以进一步解释“应用程序之间共享”是什么意思 – EugeneP 2010-02-17 08:39:23

+0

@EugeneP相应地更新了我的答案。 – malaverdiere 2010-02-18 04:40:32

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

如果我没记错的话(它已经有一段时间)还有一个办法以通知的情况下死亡的容器。在这种情况下,容器将删除死实例并实例化一个新实例。

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

+0

JCA确实支持池化,但用于入站/出站连接。国际海事组织,如果你只是想集中,这有点矫枉过正。 – ewernli 2010-02-17 12:40:19

+0

这个问题提到管理由外部系统提供的会话池并在独立应用程序之间共享。像这样的需求通常会在类似许可的情况下限制来自单个源(如盒子或CPU)的连接数量。 – Faron 2010-02-17 12:56:16

+0

你其实很对。 JCA可能是适当的。如果池为不同的Web应用程序共享,它也可以解决Classloader问题。 (无论如何我已经投票支持你)。 – ewernli 2010-02-17 18:40:42