在J2EE 1.3中消除服务定位器实现中的缓存 - 编程入门网
将缓存不论哪个组件首次 使用时所重载的名称的资源。当不同的绑定组件使用相同的资源名的时候,这个组件将不 能得到它所绑定的那个资源,它将得到在缓存中的资源,而这个资源就是第一个组件的资 源。
服务定位器何时会出错 让我们一步步的通过这个过程来看看具体是在哪里出错: 在部署阶段,部署者绑定两个资源,如上文所述( 表 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 里是相同的:
servlet 创建每个 bean 的一个实例并且运行它。我也配置容器两个不同的数据源。 当我部署我的应用程序时,我为每个数据源绑定一个 bean。 我的第一个实现没有使用服务定位器, bean 本 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |