【问题标题】:JSF 1.2: Too many small session beans: Is it bad and what the alternativesJSF 1.2:太多的小型会话 bean:是不是很糟糕以及有什么替代方案
【发布时间】:2017-07-27 08:22:09
【问题描述】:

有一个 JSF 1.2 应用程序在可观察的未来无法切换到另一个版本/技术。通常需要显示一个小型(模态)表单,该表单需要在多个请求中保持某种状态。工作完成(确认或取消)后,在表单再次打开之前不需要此状态。有很多这样的表单和会话对象(单独的执行表单会话 bean 或特殊的大型会话 bean 的成员)用于保持它们的状态。这些会话可能会持续足够长的时间,可能会持续整个工作日。所以很多对象不必要地加载会话范围。

是否有一种简单、标准的方法可以在不再需要会话对象时对其进行清理?您对此有何解决方案?

【问题讨论】:

  • 我们现在在做什么。与 anil 的建议类似,我们有一个会话 bean,其中包含这些特定于表单的小型对象的字段和访问方法(在 JSP 中访问,如 #{containerBean.formBean})。但是这种方法需要针对并发问题进行特殊的手动编程。此外,我的 IDE(Eclipse)经常在这个容器 bean 上挂起代码导航(因为成员的数量已经非常庞大)。

标签: performance session jsf javabeans


【解决方案1】:

@亚历克斯,

正如您所提到的,您有多个视图/页面要在多个请求中呈现/保留,并且会一直持续到用户会话未过期。 这只是因为 bean 范围是 session ,可能你这样做是为了避免多次 db 调用以实现性能,只是避免在每次请求时从数据库重新加载相同的信息。

我认为您在用户会话 bean 或任何其他您认为最好的会话 bean 中创建一个集合(根据您的选择,但我建议仅为此目的创建新 Bean)。 在此集合中,您只需将模型数据放在页面上要显示的内容,不要在上下文文件中注册此 bean。将对象保留在您需要的位置,就像您拥有三个页面 .P1、P2 和 P3 一样,在 P3 之后您想从会话中删除 model1(您的 pojo),然后在导航事件中只需从集合中删除 model1。

//Sample code which  help to understand what I am saying 


@Session
UserBean {
  Map tempBean<Obejct,String>=new HashMap<Object,String>();

        //just for example  suppose you want to load Model1

        public Model1  viewP1() {
            if(tempBean.get("P1info")==null){//key for P1 view 
            Model1 m1=db.getP1info();
            tempBean.put("P1info",m1);
        }

        return (m1)tempBean.get("P1info");
    }
}

要从会话中删除 Model1 数据,只需将键“P1info”的值设置为空,在上述代码的情况下,您可以使用 Wea​​kHashMap,如果您不想从 Map 中删除键。但请确保删除值部分在您不想在会话中保留 Model1 值之后触发事件。

我希望这将适用于您的情况。如果在实施中有任何问题,请告诉我,因为我没有共享工作代码,而只是展示概念。

【讨论】:

    【解决方案2】:

    试试看这里 link 一旦“工作完成”,我将对所有对象运行删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 2010-12-16
      • 1970-01-01
      相关资源
      最近更新 更多