2

我们正在将我们的多数据库 Web 应用程序从 LS 迁移到 Java bean 架构,但正在努力决定如何最好地处理数据库连接以及我们应该为它们使用什么范围。

如果我们使用 sessionScope,那么每次调用都会为每个用户创建到 5-6 个数据库的连接。如果我们使用 applicationScope bean 进行数据库连接,那么它将保持打开状态,直到服务器重新启动,从而导致内存泄漏。我知道某些值(例如很少更改的系统配置值)可以在 applicationScope 级别缓存,但我担心其余的连接。

我的问题真的是在不影响性能或内存泄漏或自动 GC 问题的情况下处理 domino 数据库连接(domino 对象不可序列化)的最佳方法是什么?

4

2 回答 2

2

这是一个艰难的问题,因为它涉及构建一个特定的解决方案,而不是一些通用的“这比那个更好”的建议。我们在构建消费者 XPage 应用程序以便从其他数据库检索数据方面取得了巨大成功。有点像带有数据库后端但带有 Domino 的前端。

我们不使用 applicationScope 任何东西,因为应用程序没有任何全局性,但即使有足够的喋喋不休表明可能 applicationScope 并不像听起来那么普遍,因此您必须密切监视您的对象。

您已经解决了 Domino 对象问题,因此无论您选择哪种方法都必须这样做。

根据您的应用程序,您可能正在关注一些主要的重新架构,但我的建议是首先使用 sessionScope 尝试它,看看它是如何执行的。做一些基准测试。如果它工作得足够快,那就继续吧,但是当你开发你的 bean 时,你应该非常关注性能优化。多个数据库调用可能是一个问题,但你真的不会知道,直到你稍微玩一下它。

有帮助的一件事是,如果您使用比您最初认为需要的更详细的架构来构建您的类 bean(不要试图将所有内容堆积到单个类或 bean 中),不仅可以更容易地调整您的如果需要,您还将开始看到您可能甚至不知道的设计模式的可能性。

于 2013-04-16T02:40:03.940 回答
1

正如罗素所提到的,没有一种方法可以做到这一点,每种方法都有其优点/缺点。

有一个 Wrapped 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() 进行了一些处理。因此,您仍然会产生与数据库对象的 make/recycle() 相同的开销。

您将发现的主要开销是在 Java 代码中创建与数据库的连接。一旦建立了连接,其他一切都会相对更快。

在测试性能时,我建议您使用 XPages Toolkit。关于如何使用它的视频是 openNTF 上 XPages Masterclass 的一部分。

http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=XPages%20Masterclass

于 2013-04-16T07:13:52.037 回答