快速业务通道

在J2EE 1.3中消除服务定位器实现中的缓存 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
表示它。然后就可以在需要的时候访问这个变量。

在J2EE 1.3中消除服务定位器实现中的缓存(7)

时间:2011-04-02 IBM Bobby Woolf

为何重载资源名?

重载资源名使得服务定位器与其缓存之间变得混乱。除了去除缓存之外还有其他的选 择么?为和不避免资源名的重载?

将每个组件的资源名绑定到容器的资源名是 J2EE 1.3 规范的一部分。一个不支持这 点的应用程序就不是 J2EE 所允许的。应用程序在部署阶段必须支持资源名绑定。这意味 着如果多个组件使用相同资源名的话,这个名称在部署时期就会被重载。

可选的解决方法

既然一个共享的资源名可以变成重载的,那么当我们使用缓存服务定位器时我们的组 件仍然会接收到正确的资源,这又是为何呢?下面就是一些操作:

每个组件一个唯一的资源名

一个方法是确保每个组件使用唯一的资源名。通过那个方法,没有两个组件使用相同 的资源名,因此就没有名称被重载。例如,EJB com.acme.AcmeEJB 使用容器资源 jdbc/datasource 可以实际的使用资源名称 jdbc/com/acme/AcmeEJB/datasource。由于 每个 EJB 类都有一个唯一的包和类名,这种命名方法保证了每个组件的资源名将是唯一 的。虽然这是一种很笨重的实现方法。当不同组件类型计划使用相同的资源时,这可以使 得它们轻易的使用相同的资源名。

每个组件类型一个唯一的服务定位器实例

另外一个方法是每个组件类型使用它自身的服务定位器实例,而不是集合。通过这个 方法,每个特定类型的组件将得到其自身的缓存引用,而不会与任何其它组件缓存有冲突 。然而,这实现起来很难。每个 Web 应用程序在何处存储它的要与其他 Web 应用程序和 EJB 类型有区别的服务定位器呢?对 EJB 类型来说,每个类可以为它的服务定位器声明 静态变量,但 EJB 类的静态变量必须是只读的(因此就是 final 类型),这就要求重新 设计服务定位器类,以使他的无参数构造器不抛出异常。而且,良好分解的 EJB 通常代 表许多简单的 Java 对象,这些对象将不能知道要使用哪个服务定位器,然后可能要以某 种方式调用 EJB 来取得。服务定位器作为集合的形式实现起来要简单的多。

不要使用服务定位器

组件可以通过根本不使用服务定位器而避免重载缓存的名称的问题,但是这种方法又 有点错杀一千的感觉。 Service Locator 模式对封装使用 JNDI 的代码仍然有用,即使 定位器不使用缓存。如果把这个模式都全盘否定而失去了这个封装性,那将是一件很不幸 的事。

剩下的一个选择是使用服务定位器使用集合的方式,但是要去除引用缓存。将其应用 于现有应用程序很简单:只要改变服务定位器实现去禁止或去除缓存。

在容器中缓存

最终,最好的回答是不在应用程序中缓存,而是缓存于容器当中。首先,这将对所有 可以缓存的应用程序有用,不论它们是否使用 Service Locator 模式。其次,容器可以 通过它们的容器名缓存资源,这些名称必须是唯一的因此它们就不会在任何单独的 J2EE 应用程序部署中被重载。

这只是恰巧发生在 WebSphere Application Server 缓存 JNDI 引用结果时。更多的 细节请参见 WebSphere Application Server Information Center(参加 参考资料)。

正如前文所述,每个对象也可以缓存它在实例变量中使用的 JNDI 引用,所以每个对 象在某一时刻只能访问一个资源。

结束语

重载资源名实际开始于 J2EE 1.3。组件通常共享资源名,部署者可以映射组件并使其 对不同容器资源共享其名称。带有资源缓存的集合服务定位器创建全局缓存,通过这种方 式不能为重载的资源名正确处理组件级映射。

简单的结论是:使用服务定位器进行缓存不是一个好的主意。包含缓存服务定位器的 应用程序迟早要出问题,而且这个问题将很难检测、很难再现且很难诊断。毫无疑问会发 生问题,

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号