【问题标题】:Memory implications of OmniFaces ViewScoped bean?OmniFaces ViewScoped bean 的内存影响?
【发布时间】:2014-02-09 18:48:51
【问题描述】:

据我了解,ViewScoped bean 仅在发生以下情况之一时才会被销毁:

1) JSF 向另一个页面发送一个 POST 请求,其中包含 <h:commandLink...> 之类的内容

2)打开的bean数量超过最大阈值设置(默认为15)

3) 用户会话过期

这是我的困惑:

#1 是否意味着如果用户使用 GET 请求离开页面,bean 将保持打开状态,即使最终 JSF POST 发生在另一个页面的同一浏览器选项卡中?或者,无论用户在哪个页面上,一旦发送 JSF POST,该浏览器选项卡的所有活动 @ViewScoped 实例都会被销毁?

#2 是否意味着用户可以为每个 @ViewScoped 类激活 15 个 bean 实例?还是不管类是 15 个 bean 实例——这意味着我可以有 5 个 Class1 实例、5 个 Class2 实例和 5 个 Class3 实例,而一个新 bean 会破坏最旧的活动 bean?

对于#3,如果 STATE_SAVING_METHOD 设置为“client”,这会对 ViewScoped bean 被销毁有任何影响吗?据我所知,如果将 STATE_SAVING_METHOD 设置为客户端,则需要一种手动控制会话过期的方法。

最后,有没有办法管理活动的 ViewScoped bean,以便在用户单击“注销”时销毁它们?

【问题讨论】:

  • 这将是一个漫长的故事,但简而言之,它与 JSF 自己的 @ViewScoped 的工作方式没有什么不同。
  • 关于管理 @ViewScoped bean 的最后一个问题,如果会话删除保证它们将被删除,我看不出有任何理由进行这样的操作。
  • 我猜最后一个问题是存在的,以防当 STATE_SAVING_METHOD 设置为客户端时,bean 在会话到期时不会被销毁。我主要担心的是我在 ViewScoped bean 中存储了太多没有被破坏的信息(例如表数据)。我想确保我正确使用了这个范围。看起来 ViewScoped 可能只是为表单的页面设计的,这些表单会被提交按钮破坏,但它也可以方便地缓存计算数据,只要使用它不会出现内存问题。
  • 只需使用 JPA 处理实体并利用缓存作业。请记住,在 Java 中,您不是在内存中存储值的副本,而是在内存中存储引用。
  • @BalusC,那么什么时候用omnifaces viewscope代替jsf viewscope呢?

标签: jsf omnifaces view-scope


【解决方案1】:

我通过向每个 @ViewScoped bean 添加一个 @PreDestroy 方法并在它被销毁时进行记录来找出这些问题的答案。对于可能对此感到好奇的其他人:

对于#1,如果您使用 GET 请求离开页面,bean 不会被破坏,但稍后会发送一个 post 请求。该 bean 将保留在内存中,直到达到“最大活动视图范围”设置并且轮到 bean 被销毁或会话无效。

对于#2,类无关紧要。您可以拥有 5 个 Class1 实例、5 个 Class2 实例和 5 个 Class3 实例,如果您的阈值为 15,一个新的 ViewScoped bean 实例将销毁最旧的 bean。

对于#3,即使将 STATE_SAVING_METHOD 设置为客户端,一旦会话无效,bean 似乎也会被销毁。

【讨论】:

  • 感谢您提出有趣的问题和分析。您的评论并不总是区分被调用的@PreDestroy 方法意义上的“销毁”和垃圾收集视图bean 本身的能力。我在这里stackoverflow.com/questions/40569971/… 提出了一个相关问题,并通过GitHub 提供了一个测试Web 应用程序,用于轻松比较@PreDestroy 和各种@ViewScoped bean 类型的堆引用(垃圾回收率):github.com/webelcomau/JSFviewScopedNav
猜你喜欢
  • 2012-08-24
  • 1970-01-01
  • 2014-01-07
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多