我们正在将我们的多数据库web应用程序从LS迁移到Java beans架构,但正在努力决定如何最好地处理数据库连接,以及我们应该为它们使用什么范围。
如果我们使用sessionScope,那么将为每个用户创建每个调用5-6个数据库的连接。如果我们使用applicationScope bean进行数据库连接,那么它将保持打开状态,直到服务器重新启动,从而导致内存泄漏。我知道某些值,比如系统配置值很少更改,可以在applicationScope级别缓存,但我担心其余的连接。
我的问题是,在不影响性能、内存泄漏或自动GC问题的情况下,处理domino数据库连接(domino对象不可序列化)的最佳方法是什么?
发布于 2013-04-16 10:40:04
这是一个困难的问题,因为它处理的是架构特定的解决方案,而不是一些通用的“这比那更好”的建议。我们已经成功地设计了一个消费者XPage应用程序,以便从其他数据库中检索数据。一种带有数据库后端但带有Domino的前端。
我们不使用applicationScope,因为应用程序没有全局的东西,但即使有足够的传言表明applicationScope可能并不像它听起来那样无处不在,因此您必须密切监视您的对象。
您已经解决了Domino对象问题,所以无论您选择哪种方法,都必须解决这个问题。
根据您的应用程序,您可能会放弃一些主要的重新架构,但我的建议是先在sessionScope上尝试一下,看看它的性能如何。做一些基准测试。如果它工作得足够快,那么就去做吧,但在开发bean时,您应该非常密切地关注性能优化。多个数据库调用可能是一个问题,但你真的不会知道,直到你玩了一小段。
有一件事是有帮助的,那就是如果你使用一个比你一开始认为需要的更详细的架构来构建你的类bean(不要试图把所有的东西都堆到一个类或bean中),如果需要的话,你不仅可以更容易地调整你的架构,而且你还会开始看到一些你甚至不知道的设计模式是可能的。
发布于 2013-04-16 15:13:52
正如罗素提到的那样,没有一种方法可以做到这一点,而且每种方法都有自己的优缺点。
有一个包装的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()的一部分。因此,通过对数据库对象进行have /recycle(),仍然会产生相同的开销。
您将发现的主要开销是在Java代码中创建到数据库的连接。一旦建立了连接,其他一切都会相对更快。
我建议您在测试性能时使用XPages工具包。有关如何使用它的视频是openNTF上的XPages主类的一部分。
http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=XPages%20Masterclass
https://stackoverflow.com/questions/15948446
复制相似问题