我回来构建一个hashMap的Managed-Bean.(创建类型为<String,Object>的HashMap)我已经定义了一个类
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
}
Run Code Online (Sandbox Code Playgroud)
托管bean将创建hashMap的Application Scope变量.在Bean的构造函数中,我通过从许多不同的地方收集所有信息来为每个应用程序(密钥)构建值.repID非常简单.我的问题/关注是将appBD存储在Application Scope变量中是明智的.我已经读过一个永远不应该在Scoped变量中存储Notes对象这会是一个问题吗?其次,如果是这种情况,我可以向AppProperties添加一个方法,当调用获取应用程序数据库的方法时,该方法将打开DatabaseByReplicaID,这会给进程增加一些开销,因为数据库对象将被调用许多很多时候在应用程序的生命周期中.
是的,您不应该将Notes对象存储在bean的范围变量和属性中.
因为它们不可序列化(某些范围必须)并且它们将在生命周期之间回收.更确切地说,由于它们基于C句柄,因此XSP引擎在请求 - 响应周期之间创建Notes对象,并且当响应写回用户时,它们都将被回收.试图将它们留在内存中会使它们对您的服务器"有毒".
您可以在bean中定义一个方法(如GetHelpDb()),并在需要时创建并返回它.这不是一个巨大的性能成本.因为Domino服务器实现了数据库的缓存.当您反复打开数据库时,不会生成额外的磁盘I/O.
在这种情况下与Notes数据交互的最佳实践是缓存.我经常在我的应用程序中使用这种方法.您可以在单个方法中获取值,将它们缓存到HashMap中,并在需要时从地图中获取它们.使用getter方法,您还可以检查基于时间的值以处理超时.