在我当前的项目中,我有一个一般要求,即使现有的 XPage 应用程序更快。我们看到的一件事是如何加快一些较慢的预先输入字段,而对此似乎很快的一种解决方案是使用 FTSearch 而不是我们最初拥有的 DBColumn 来实现它。我想就这是否是一种可行的方法获得建议,或者是否有任何建议可以以不同的方式做我们需要的事情。
背景:虽然影响速度的因素有很多(如网络延迟、服务器操作系统、可用服务器内存等),但由于我们使用的是 8.5.3,但我们在总体上尽可能地优化了应用程序,利用使用 IBM Toolkit 来查找问题区域,并使用 IBM 在 8.5.3 中添加的功能来帮助解决此问题(例如,部分执行,使用优化的 JS 和 CSS 选项等)。不幸的是,我们又被困在运行在 32 位 Windows 操作系统和 3.5Gb 内存的服务器上几个月。
响应最慢的元素之一是在某些引用大量文档的提前输入中。最差的情况平均在建议的列表出现之前大约 5 或 6 秒出现在启用预先输入的字段中。它使用 SSJS 调用 java 类以执行 dbcolumn 调用(使用 Ferry Kranenburg 的 XPages Snippet)以从视图中获取唯一列表,然后返回 SSJS,它循环遍历数组以检查每个条目是否包含搜索键值,并且如果找到,它会在单词中的搜索文本周围添加一个突出显示(粗体)的 html 标记,然后将格式化列表返回给浏览器。我添加了一个打印语句来输出运行代码所用的时间,今天在我们的开发服务器上平均大约是 3250 毫秒。
我尝试了一些方法来了解如何让这个过程更快:
添加了一个 Java 类来执行所有处理(因此不使用 SSJS)。这只平均节省了 100 毫秒。
使用视图范围的托管 Bean,我在加载页面时将唯一的查找列表加载到内存中。这会产生非常快的预先输入响应(16 毫秒),但我怀疑这是对大型数据集执行此操作的一种非常糟糕的方法 - 如果多个用户正在访问应用程序,可能会真正影响通用服务器。我试图找到关于什么会被认为是一个大对象的信息,但找不到任何关于在内存中存储多少太多的指导或建议(我搜索了 JSF 和 XPage 站点)。有人对此有什么建议吗?
仍然在 Java 类中 - 我没有执行 dblookup 来获取要搜索的所有值的“列表”,而是让代码运行 FT Search 来获取文档集合,然后循环每个文档以提取我想要的字段值和将它们添加到“SortedSet”(自动不允许重复),然后循环排序集以在搜索词周围插入粗体标签,并将其返回给浏览器。这平均需要 100 毫秒 - 这很棒而且几乎不引人注意。这种方法是否有缺点 - 或者我不应该这样做的原因?
感谢您对此的任何反馈或建议。帕姆。
2013 年 8 月 14 日更新:我尝试了另一种方法(受OpenNtf上的 IBM/Tony McGuckin Insights 应用程序的启发)作为 Company Search type-ahead,它使用托管 bean 并且可以快速处理大量数据。
4. 尽管 Insights 应用程序处理跨多个数据库拆分的数据,但预输入的原理是相似的。我不能使用带有 getAllEntriesByKey 的视图,因为我也需要在文本中搜索字符串,而不仅仅是在条目的开头。我尝试基于视图 FTSearch 创建 ViewEntryCollection,但由于列中有很多重复名称,这并没有给出我想要的唯一列表。然后我尝试在分类视图上使用 NotesViewNavigator,并循环浏览它。这产生了我需要的唯一列表,但结果证明它比上述任何其他方法都慢。(我确实实现了这些ViewNavigator 性能提示)。