Java 对象池:如何

Java 对象池:如何,java,pooling,object-pooling,Java,Pooling,Object Pooling,我需要实现一个由外部系统返回的会话池, 因此,我可以在需要时立即重用它们(创建会话需要一段时间)。 我曾与datasource合作创建了一个数据库连接池(来自Apache的DBCP),结果是 已实施的解决方案 在一般情况下,我们使用什么来汇集任意对象,是否有实现的解决方案,即对象,而不是接口,来痛苦地处理任务 第二个问题是,我们如何测试会话是否处于活动状态?在对象池中是否有我们重写的特定方法,用于查询会话自己的方法 第三个非常重要的问题是,对象池对象是否应该是静态的?我从系统中提取的一组对象必须

我需要实现一个由外部系统返回的会话池, 因此,我可以在需要时立即重用它们(创建会话需要一段时间)。 我曾与datasource合作创建了一个数据库连接池(来自Apache的DBCP),结果是 已实施的解决方案

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

第二个问题是,我们如何测试会话是否处于活动状态?在对象池中是否有我们重写的特定方法,用于查询会话自己的方法

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

  • 对于通用对象池, 你有理由这么做
  • 用于测试 如果会话处于活动状态,则有 不同的方式,但很多都是 不可靠的。而且是可靠的 (在
    dual
    上执行查询)速度较慢。 你可以看看, 它内置了这个功能
  • 只要您的许多Web应用程序都在同一个WAR文件中,我认为您就可以使用这个静态池对象。不过,就个人而言,我更喜欢单例对象,而不是静态对象,因为静态对象除了实用方法和常量之外,没有任何东西

  • 总的来说,我非常喜欢
    Hibernate
    。。。您是否考虑过在应用程序中使用它?您仍然可以通过它生成简单的SQL查询,并且可以处理您的池和缓存。

    < P>如果您使用J2EE应用服务器,那么考虑构建实现java连接器架构()的组件。组件的每个实例都访问一个会话,您可以将容器配置为最多创建五个(来自您的示例)实例。容器管理池和组件的生命周期。此外,部署在该应用服务器上的所有应用程序都共享该组件的池

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


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

    如果您已经熟悉Commons DBCP,那么这是基于Commons Pool,它是一个通用对象池库。@skaffman可能是,但在这里,我只看到少数实现不做任何事情,不足以让它工作。还有更具体的吗?您需要扩展
    BaseObjectPool
    ,这很简单。您需要做一些工作…所以我需要创建自己的数据结构,并重写addObject/returnObject以保存结构中的内容?这就是解决问题的方法吗?@mlaverd第3段-我稍微修改了我的问题,以进一步解释“应用程序间共享”的含义sJCA确实支持池,但用于入站/出站连接。依我看,如果你只是想使用池,那就有点过分了。问题是管理一个由外部系统提供并在独立应用程序之间共享的会话池。这样的需求通常出现在诸如许可证之类的限制来自单个源(如机箱或CPU)的连接数的情况下。实际上,您是非常正确的。JCA可能是合适的。如果池为不同的web应用程序共享,它还可以解决类加载器问题。(无论如何,我都投票支持你的答案)。