快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
将缓存不论哪个组件首次 使用时所重载的名称的资源。当不同的绑定组件使用相同的资源名的时候,这个组件将不 能得到它所绑定的那个资源,它将得到在缓存中的资源,而这个资源就是第一个组件的资 源。

服务定位器何时会出错

让我们一步步的通过这个过程来看看具体是在哪里出错:

在部署阶段,部署者绑定两个资源,如上文所述( 表 4)。

让我们从应用程序启动后说起,第一个用户是雇员并使用 EmployeeBean 访问数据库 。 EmployeeBean 使用缓存服务定位器访问 jdbc/AccountDB

服务定位器没有在它的缓存中找到 jdbc/AccountDB,因为此时缓存是空的。

reference cache { }

服务定位器执行 JNDI 查找并取得容器资源 jdbc/AccountEmployeeDS。服务定位器将 这个资源添加到缓存中 jdbc/AccountDB 关键字下面:

reference cache {jdbc/AccountDB jdbc/AccountEmployeeDS}

服务定位器返回容器资源 jdbc/AccountEmployeeDS。

现在正如所预料的那样,EmployeeBean 中有了资源 jdbc/AccountEmployeeDS。

现在另外一个用户,一个顾客,开始使用应用程序,使用 CustomerBean 访问数据库 。 CustomerBean 使用缓存服务定位器访问 jdbc/AccountDB:

此时,服务定位器在它的缓存中找到了 jdbc/AccountDB。

reference cache {jdbc/AccountDB jdbc/AccountEmployeeDS}

服务定位器略过 JNDI 查找并取而代之的使用缓存中的资源。

服务定位器返回容器资源 jdbc/AccountEmployeeDS。

CustomerBean 现在拥有了资源: jdbc/AccountEmployeeDS。问题出现了: CustomerBean 现在拥有了 jdbc/AccountEmployeeDS,而不是它该拥有的 jdbc/AccountCustomerDS。 CustomerBean 现在使用错误的数据源。

检测缓存问题

当两个组件使用一个重载的资源名,也就是说,一个名称绑定到两个不同的资源,缓 存服务定位器为两个组件返回相同的资源。这是一个非常微妙的错误,并且难以检测和诊 断。

设想一下在我们的例子中错误的结果以及这是如何的难以诊断:

如果雇员先访问,客户取得了数据源,通过这个数据源他就可以访问机密数据表。这 在功能测试中很难发现,特别地是在如果 Java 应用程序适当的组织了客户对某些专有数 据的访问时。如果可以检测到这个问题,那么只是会偶尔在雇员先到的时候发生这样的错 误。只有偶尔会发生的问题是很难确定问题的起因的。

如果客户先访问,那么就会使用客户数据源,雇员就不能访问机密数据表了。这个问 题更加明显一些并且比较容易检测,但却很难解释。静态的代码分析清楚的显示了 EmployeeBean 使用雇员登录数据源。而且,只是偶尔发生问题。要花费多长时间解决当 客户先访问时发生的问题呢?要解决由服务定位器导致的问题的难度有多大呢?

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

时间:2011-04-02 IBM Bobby Woolf

运行时证据

如果您正特别的寻找这个错误,那当然容易找到,就像您为正确的症状在正确的位置 查找一样。我实现了两个无状态会话 bean 类,他们都通过相同的资源名访问数据源: jdbc/datasource。在 bean 访问过它的数据源后,打印出对象的 toString()。这段代码 在两个 bean 里是相同的:

public void persist()     throws Exception {   Context root = new InitialContext();   DataSource ds = (DataSource) root.lookup ("java:comp/env/jdbc/datasource");   System.out.println("The datasource is: " + ds.toString());   // use the datasource to persist some data }

servlet 创建每个 bean 的一个实例并且运行它。我也配置容器两个不同的数据源。 当我部署我的应用程序时,我为每个数据源绑定一个 bean。

我的第一个实现没有使用服务定位器, bean 本

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号