6-31 基于NOTES的客户机与服务器时钟同步技术

胥永康 席传裕

  在NOTES应用中经常需要用到当前系统时钟,如果每次都从服务器提取时间不仅会增加代码编写工作量,还会增加服务器和网络开销,如果直接提取客户机时间势必会遇到客户机时钟各不相同的问题。为了实现简单高效地从客户机得到统一准确的当前系统时钟,必须考虑所有客户机与服务器之间的时钟同步问题。

  为了实现客户机与服务器的时钟同步,首先必须确定一个同步标准时钟。任何普通用户都可以随意修改自己客户机上的系统时钟,却没有修改服务器系统时钟的权限,所以将服务器时钟作为同步标准时钟。在启动客户机应用程序之前,首先提取服务器系统时间,然后将客户机时钟重新设置为服务器时间,那么以后就可以通过提取客户机时钟来得到统一的系统时钟了。这种方法需要设置客户机时钟,这有可能对客户机上的其它应用程序产生影响。如果不希望设置客户机时钟,可以在启动客户机应用程序之前,首先同时提取客户机系统时间和服务器系统时间,然后计算两者之间的时间差并作为全局变量保存,那么以后就可以通过该时间差来调整客户机时间从而得到统一的系统时钟了。

  如果后台数据库为关系数据库,通过执行相应的SQL语句,根据返回结果就可以得到服务器系统时钟。如果后台数据库为DOMINO,可以在一个运行在服务器上的数据库中创建一个空NotesDocument对象,取其CREATED属性来作为当前服务器的系统时钟。

  提取到服务器系统时钟后,可以在应用的“Initialize”、“PostOpen”或者“Terminate”事件下编写相应的程序来重新设置客户机时钟。由于设置机器时钟涉及到操作系统,可以通过调用API函数来完成。在APISetLocalTime 函数和SetSystemTime函数都可以用来设置系统时钟,区别在于SetSystemTime 函数按格林威治标准时间表示,而SetLocalTime 函数按计算机本地时区时间表示。为了解决时差问题,可以通过GetTimeZoneInformation函数得到客户机所在时区信息,然后根据时区信息将格林威治标准时间修正为计算机所在时区的时间。

  如果不想直接设置客户机时钟,同时又想得到统一的系统时钟,可以在启动客户机应用程序之前,通过计算客户机和服务器之间的时间差并作为全局变量保存,那么以后就可以用该时间差来调整客户机时间从而得到统一的系统时钟。客户机时间通过NOW表达式得到,服务器时间通过新建文档CREATED属性得到,时间差通过SetTimeDiff函数得到,然后用函数AdjustSecond 来调整时间差,最终实现时钟间接同步。

go-back.gif (221 bytes)