我们正在将我们的多数据库web应用程序从LS转移到Java bean体系结构,但是正在努力决定如何最好地处理数据库连接以及我们应该为它们使用什么作用域。
如果我们使用sessionScope,那么每次调用将为每个用户创建到5-6个数据库的连接。如果我们为数据库连接使用applicationScope bean,那么它将保持打开状态,直到服务器重新启动,从而导致内存泄漏。我理解某些值,如很少更改的系统配置值,可以在applicationScope级别缓存,但我关心的是其余的连接。
我的问题是处理domino数据库连接(domino对象不可序列化)而不影响性能、内存泄漏或自动GC问题的最佳方法是什么?
这是一个困难的问题,因为它处理的是构建一个特定的解决方案,而不仅仅是一些通用的"这个比那个更好"的建议。我们已经非常成功地构建了一个消费者XPage应用程序,以便从其他数据库检索数据。有点像前端和数据库后端,但是使用Domino。
我们没有使用任何applicationScope,因为应用程序没有全局的东西,但是即使有,也有足够的信息表明applicationScope可能并不像听起来那么普遍,因此您必须密切监视您的对象。
您已经解决了Domino对象问题,因此无论您选择哪种方法,都必须这样做。
根据你的应用程序,你可能会盯着一些主要的重构,但我的建议是先尝试它与sessionScope,看看它是如何执行的。做一些基准测试。如果它运行得足够快,那么就可以这样做,但在开发bean时,您应该密切关注性能优化。多个数据库调用可能是一个问题,但你真的不会知道,直到你玩它一点点。
有一件事会有所帮助,如果您使用比您最初认为需要的更详细的体系结构来构建类bean(不要试图将所有东西都堆到一个类或bean中),不仅会在需要时更容易调整您的体系结构,而且还会开始看到您甚至可能不知道的设计模式。
正如Russell所提到的,没有一种方法可以做到这一点,每种方法都有其优缺点。
有一个Wrapped Document类可以用来存储Document信息。
public static DominoDocument wrap(java.lang.String database,
lotus.domino.Database db,
java.lang.String parentId,
java.lang.String form,
java.lang.String computeWithForm,
java.lang.String concurrencyMode,
boolean allowDeletedDocs,
java.lang.String saveLinksAs)
Javadoc在这里:
http://public.dhe.ibm.com/software/dw/lotus/Domino-Designer/JavaDocs/XPagesExtAPI/8.5.2/com/ibm/xsp/model/domino/wrapped/DominoDocument.html然而,这只是在后台处理recycle()的一些操作。因此,通过对数据库对象执行/recycle(),仍然会产生相同的开销。
您将发现的主要开销是在Java代码中创建到数据库的连接。一旦这个连接建立起来,其他的一切都会相对更快。
我建议在测试性能时使用XPages Toolkit。关于如何使用它的视频是openNTF上XPages Masterclass的一部分。http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument& name = XPages % 20大师级