在实际使用 XPages 的过程中,我们发现第一次访问时会非常慢,有时候甚至要等5秒钟以上。这是因为第一次访问时需要加载一些 XPages 相关的 class,所以耗时比较长。

为了解决这个问题,在 Domino 8.5.3 中引入了 XPages 预加载功能。通过以下 Notes.ini 参数实现:

XPagesPreload=1
XPagesPreloadDB=myDb.nsf/myXPage.xsp,myDb.nsf/test.xsp

请参考:Domino Designer 8.5.3 中的新增功能

我相信只要是做开发的,就会维护别人写的代码;只要做维护代码工作,就会有全局搜索代码的需要。可惜在 Domino 开发中这不是一件容易事儿:只能先生成代码摘要,然后从摘要中搜索。而且摘要还有大小限制、又不包括计算文本的内容。

所以之前我们想了很多办法:用 DXL 导出设计元素、使用 TeamStudio 等等。从 Domino Designer 8.5 转到 Eclipse 平台以后,为我们带来了一项新的搜索功能,用法如下:

  1. 打开任意一个代理或 Script 库或 XPage
  2. 通过“搜索>搜索”菜单,或“Ctrl+H”打开搜索对话框
  3. 按下图填写条件
  4. 查看结果,双击可以打开相应的设计元素

我们之前提到过,XPages 是基于 JSF 1.1 开发的,在 JSF 中有个很重要的概念:生命周期的六个阶段

在开发 XPages 的过程中,我们经常遇到一段代码会运行很多次的情况,实际上就是在不同的阶段执行的。我们通过 LifeCycleListener 可以记录每个阶段的开始/结束,有助于我们更深入的理解 XPages。结果类似于:

HTTP JVM: Before phase: RESTORE_VIEW 1
HTTP JVM: After phase: RESTORE_VIEW 1
HTTP JVM: Before phase: APPLY_REQUEST_VALUES 2
HTTP JVM: After phase: APPLY_REQUEST_VALUES 2
HTTP JVM: Before phase: PROCESS_VALIDATIONS 3
HTTP JVM: After phase: PROCESS_VALIDATIONS 3
HTTP JVM: Before phase: UPDATE_MODEL_VALUES 4
HTTP JVM: After phase: UPDATE_MODEL_VALUES 4
HTTP JVM: Before phase: INVOKE_APPLICATION 5
HTTP JVM: After phase: INVOKE_APPLICATION 5
HTTP JVM: Before phase: RENDER_RESPONSE 6
HTTP JVM: some debug info from print()…
HTTP JVM: After phase: RENDER_RESPONSE 6

通过添加以下 Notes.ini 参数,可以抓取 LotusScript 的调用堆栈,帮助我们分析宕机等问题:

DEBUG_LS_DUMP=1

结果格式如下:

LotusScript Call Stack
<@@ ------ LotusScript Interpreter -> Call Stack for [ nlnotes:  0ef8:  1494]  (Time 10:38:14) ------ @@>

[3] COUNTVIEWS
[2] GETDBINFO @ line number 7
[1] COUNTDOCUMENTS @ line number 12
[0] INITIALIZE @ line number 2

请参考:Examining LotusScript call stack after a crash or hang with NSD

Notes/Domino 8.5.3 已于10月4日发布,包含了很多实用的新功能:

  • 版本控制支持:可以将库中的每一个设计元素通过 SVN 等版本控制系统管理
  • JavaScript/CSS 聚合:服务器自动将多个 JS/CSS 文件动态合并为一个,大大改善性能
  • XPage 预加载选项:减少首次访问 XPages 时的等待时间
  • 全文搜索排序:新的 FTSearchSorted API,同时 XPages 也支持此功能
  • XPages 控件增加 HTML5 支持:增加 attrs、type 属性

完整的新功能列表请参考:Domino Designer 8.5.3 中的新增功能IBM US Announcement Letter

做 Domino 开发有一段时间的人估计都见过这个错误,产生的原因是曾经把 Domino 服务器的时间往回调过。

说的更细致一些,比如服务器的时间曾经是2012年,所以视图更新时间、上次复制时间等信息都记录为2012年。这时如果把时间调回2011年,那么就算有新的文档添加到数据库,它的修改时间也比视图的更新时间要晚,所以在这种情况下视图并不会自动更新。我举的只是其中一个问题,足以说明问题的严重性。

关于如何解决这个问题,IBM 技术支持网站给出的方法是新建拷贝或者新建复本,但一个一个处理太麻烦了。可以使用我之前提到的批量拷贝库来处理这个问题:

  • 通过操作系统的 ls 命令获取文件列表
  • 生成批量拷贝库(如果需要保持复本关系要加 REPLICA 参数)的脚本
  • 将所有库拷贝到临时目录
  • 停掉服务器,删除原目录、将临时目录改名为原目录名

我实际操作过一次,一个有几十个库的系统不到半小时就搞定了。大家也可以试试看。