Java 托管Bean最佳实践

Java 托管Bean最佳实践,java,xpages,Java,Xpages,我又开始构建我的hashMap托管Bean了。我定义了一个类 public class AppProperties { private String appRepID; private String helpRepID; private String ruleRepID; private String filePath; private Vector formNames; private Database appDB; // all the

我又开始构建我的hashMap托管Bean了。我定义了一个类

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的应用程序范围变量。在Bean的构造函数中,我通过从多个不同的地方收集所有信息来构建每个应用程序的值。Repid非常直截了当。我的问题/顾虑是将appBD存储在Application Scope变量中是否明智。我已经读到,不应该在作用域变量中存储Notes对象,这会是一个问题吗?其次,如果是这样的话,我可以在AppProperties中添加一个方法,当调用获取应用程序数据库的方法时,该方法将通过replicaid打开数据库,这会给过程增加相当大的开销,因为数据库对象在应用程序的生命周期中会多次被调用。

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

因为它们不可序列化,所以对于某些作用域来说是必须的,并且它们将在生命周期之间循环使用。更准确地说,因为它们是基于C句柄的,所以XSP引擎在请求-响应周期和将响应写回用户之间创建Notes对象,它们都将被回收。试图将它们保存在内存中会使它们对服务器“有害”

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


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

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

因为它们不可序列化,所以对于某些作用域来说是必须的,并且它们将在生命周期之间循环使用。更准确地说,因为它们是基于C句柄的,所以XSP引擎在请求-响应周期和将响应写回用户之间创建Notes对象,它们都将被回收。试图将它们保存在内存中会使它们对服务器“有害”

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


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

bean还必须实现java.io.Serializable,因为您需要在请求之间存储值并获取它们again@Paul-是的,我的Bean会这样做,我的类AppProperties不会这样做,但它会被导入到序列化的Bean中,因此,我假设此时类AppProperties将由Bean.Yes序列化。如果要将其导入序列化对象,则应将其序列化。如果将NotesObject标记为瞬态,则可以将其用作bean的属性,然后让getter延迟加载它。瞬态修饰符的意思是“不要序列化这个”。重构bean后,它将为null,对getter的第一次调用可以重新初始化它。是的,可以使用临时字段来存储不应在序列化类中序列化的对象。但是,它仅在viewscope中有用。因为其他作用域没有序列化,临时对象将保留在内存中。Notes对象不应该以任何方式持久化,bean还必须实现java.io.Serializable,因为您需要在请求之间存储值并获取它们again@Paul-是的,我的Bean会这样做,我的类AppProperties不会这样做,但它会被导入到序列化的Bean中,因此,我假设此时类AppProperties将由Bean.Yes序列化。如果要将其导入序列化对象,则应将其序列化。如果将NotesObject标记为瞬态,则可以将其用作bean的属性,然后让getter延迟加载它。瞬态修饰符的意思是“不要序列化这个”。重构bean后,它将为null,对getter的第一次调用可以重新初始化它。是的,可以使用临时字段来存储不应在序列化类中序列化的对象。但是,它仅在viewscope中有用。因为其他作用域没有序列化,临时对象将保留在内存中。Notes对象不应以任何方式持久化。