在 J2EE 应用程序中,我们在 weblogic 中使用 EJB2。
为了避免浪费时间构建初始上下文和查找 EJB Home 接口,我正在考虑Service Locator Pattern。
但是在网上搜索了一些之后,我发现即使这种模式经常被推荐用于 InitialContext 缓存,也有一些关于 EJB Home 缓存的负面意见。
问题:
- 缓存 EJB Home 查找结果是否安全?
- 如果我的集群节点不再工作会怎样?
- 如果我安装新版本的 EJB 而不刷新服务定位器的缓存会发生什么?
在 J2EE 应用程序中,我们在 weblogic 中使用 EJB2。
为了避免浪费时间构建初始上下文和查找 EJB Home 接口,我正在考虑Service Locator Pattern。
但是在网上搜索了一些之后,我发现即使这种模式经常被推荐用于 InitialContext 缓存,也有一些关于 EJB Home 缓存的负面意见。
问题:
Is it safe to cache EJB Home lookup result ?
What will happen if one my cluster node is no more working ?
恕我直言,J2EE 中 ServiceLocator 的目的是缓存 EJB Home 并减少昂贵的 JNDI 查找。它在 Weblogic 上是安全的,因为默认情况下 EJB Home 在集群中是负载平衡的,这将自动允许故障转移到下一个服务器。
此值由home-is-clusterable
weblogic-ejb-jar.xml 中的值控制,此处记录的默认值为true
.
What will happen if I install a new version of the EJB without refreshing
the service locator's cache ?
我没有尝试过自己做这样的改变。但是,我猜作为您的构建/部署的一部分,您的服务定位器类也会随着对您的 EJB 的更改而重新部署 - 从而进行新的查找?
如果您的客户端在 EJB 更改期间不受影响,那么当您在其上调用方法时,缓存的 EJBHome 将返回一个过时的引用。因此,您将不得不强制刷新客户端。
缓存 EJB Home 查找结果是否安全?
是的。
如果我的集群节点不再工作会怎样?
如果您的服务器配置为集群/WLM,那么请求应该静默故障转移到集群中的另一台服务器。路由信息在存根 IOR 中编码。
如果我安装新版本的 EJB 而不刷新服务定位器的缓存会发生什么?
假设您更新 bean 而不是组件或 home 接口,那么一切都会继续工作。EJBHome 实际上是一个无状态会话 bean,因此如果可用,则可以继续从同一台服务器访问请求,如果不可用,则可以在集群中的不同服务器上访问该请求。
请注意,EJB3 中的@EJB 注入有效地鼓励了主缓存。(虽然,诚然,它也允许 SFSB 缓存,即使这显然是不正确的,所以 @EJB 可能不是我主张的最佳支持:-))。
如果我安装新版本的 EJB 而不刷新服务定位器的缓存会发生什么?
一旦您的应用程序上线,新安装的频率应该远低于对 EJBHome 的请求。
因此,您的重点和关注点应该在于频繁的实时操作,而不是瞬态开发操作。
在您的设计中考虑必要时使缓存无效的能力。