【问题标题】:Managed-Bean best practice托管 Bean 最佳实践
【发布时间】:2014-07-14 17:29:21
【问题描述】:

我又开始构建我的 Managed-Bean 的 hashMap。 (Creating a HashMap of type <String , Object>) 我已经定义了一个类

public class AppProperties {
    private String appRepID;
    private String helpRepID;
    private String ruleRepID;
    private String filePath;
    private Vector formNames;
    private Database appDB;
    // all the getters and setters
}

托管 bean 将创建 hashMap 的 Application Scope 变量。在 Bean 的构造函数中,我通过收集来自多个不同位置的所有信息来构建每个应用程序(键)的值。 repID 非常简单。我的问题/担心将 appBD 存储在 Application Scope 变量中是否明智。我已经读过,永远不应该将 Notes 对象存储在作用域变量中,这会是一个问题吗?其次,如果是这种情况,我可以向 AppProperties 添加一个方法,该方法将在调用获取应用程序数据库的方法时打开 DatabaseByReplicaID,这会为进程增加相当多的开销,因为数据库对象将被多次调用应用程序生命周期中的许多时间。

【问题讨论】:

    标签: java xpages


    【解决方案1】:

    是的,您不应该将 Notes 对象存储在 bean 的范围变量和属性中。

    因为它们是不可序列化的(对于某些范围是必须的)并且它们将在生命周期之间被回收。更准确地说,由于它们基于 C 句柄,XSP 引擎在请求-响应周期之间创建 Notes 对象,当响应写回给用户时,它们都将被回收。试图将它们保留在内存中会使它们对您的服务器“有毒”。

    您可以在 bean 中定义一个方法(如 GetHelpDb()),在需要时创建并返回它。这不是巨大的性能成本。因为 Domino 服务器实现了数据库的缓存。当您一遍又一遍地打开数据库时,不会产生额外的磁盘 I/O。

    在这种情况下与 Notes 数据交互的最佳做法是缓存。我经常在我的应用程序中使用这种方法。您可以在单个方法中获取值,将它们缓存到 HashMap(s) 中,并在需要时从映射中获取它们。使用 getter 方法,您还可以检查基于时间的值来处理超时。

    【讨论】:

    • 另外bean必须实现java.io.Serializable,因为你需要在请求之间存储值并再次获取它们
    • @Paul - 是的,我的 Bean 做到了这一点,我的 AppProperties 类没有,但它被导入到序列化的 Bean 中,所以我假设那时 AppProperties 类将由 Bean 序列化。
    • 是的。如果要导入到序列化对象中,则应该对其进行序列化。
    • 如果您将 NotesObjects 标记为瞬态,您可以将它们用作 bean 的属性,然后让 getter 延迟加载它。瞬态修饰符的意思是“不要序列化这个”。一旦你的 bean 被重构,它将为 null,第一次调用 getter 可以重新初始化它
    • 是的,瞬态字段可用于存储不应在序列化类中序列化的对象。但是,它仅在 viewscope 中有用。因为其他作用域没有序列化,瞬态对象将持久存在内存中。 Notes 对象不应以任何方式持续存在。
    猜你喜欢
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多