Lotus教程、Java教程、Java虚拟机、Java软件综合开发社区

Lotus、Domino、Java、C#、Web、数据库综合开发教程、资料社区

Lotus Domino与DB2的批量数据传输



Published by admin on 07月 31, 2010

实现Domino至DB2的批量数据传输

  在Notes 应用开发过程中,经常需要实现Notes 数据库与其他关系型数据库(如Oracle、Sybase、SQL Server、DB2等)的数据交换,为此Lotus公司推出了Notes Pump 来完成Notes 数据库与RDBMS(关系型数据库管理系统)之间高效、快速、可伸缩的批量数据交换。

一、Notes Pump 安装

—-Notes Pump 是Lotus公司Domino/Notes 系列产品之一,是一个基于服务器的32位多任务数据传输引擎。Notes Pump 包含三部分:服务器、管理员、开发客户端。Notes Pump 服务器必须安装在已装有必要的Notes DLL的平台上,但其运行可独立于已安装的Notes 服务器或客户端。”管理员”是一个Notes 的应用数据库,存储在Domino服务器上,且可运行于任何装有NotesClient4.11或更新版本的平台上。Notes Pump 开发客户是一个可选组件,安装后可为后面创建”活动(Activity)”时提供方便,并支持Notes Pump LotusScript Extensions编程。装有Notes Pump 服务器的机器还需要有相应的数据库通讯软件,如Oracle SQL *NET,DB/2CAE,ODBC等,以便和相应的数据库服务器连接。安装前还应运行相对应于所连数据库的Test程序,以确定是否连通。

—-本人使用的开发环境为:IBM Netfinity7000两台,均装有Windows NT 4.0,其中一台装有DB/2 UNVERSAL DATABASE 5.0 Server,另一台装有Lotus Domino 4.6(中文版)、Notes Pump 2.5 Server、DB/2 Client。安装Notes Pump 前运行Nottest和Db2test,输入相应的服务器名及使用者密码后显示连接成功,然后按提示安装Pump 后即可。安装完成后,打开Notes Client会发现Pump 在Domino数据库中加入了四个库文件(.nsf),分别是:Administrator、Log、Script Vault、Documentation,同时在Pump 安装的路径下会生成一个Inpump.ini文件,其中记载着安装过程用户输入的信息和选项。

二、Notes Pump 主要功能

—-Lotus Notes Pump 是一个企业级规模的数据分发服务器,它可实现RDBMS和Notes 数据库之间数据的周期性复制,主、辅Domino服务器之间数据的及时和自动的同步。数据的移动可以是调度安排的,也可以是轮询或手动的,还可以被某个特定的条件所激发。

—-在Pump 中,任意一次数据的传输都对应一个”Activity”。为适应不同的数据传输要求,Pump 在Administrator中提供了多种”Activity”,包括:Command、Poll、DPROPR、Realtime Notes、Replication、Direct Transfer、Scripted 等,每一种都有一个与之相应的表单,表单中的域用来存放此”Activity”被执行时需要告知Pump Server的信息。

—-几乎每一个”Activity”都建立在”Link”之上,”Link”的数目随”Activity”的类别而定,从零个到多个不等,”Link”是Pump 用来记录数据传输中所涉及到的源、目的数据库基本参数的,其中主要包括:数据库名、用户名和用户密码。与”Activity”类似,对应于不同厂家的数据库产品,有不同的”Link”表单(Form)。不同的”Activity”如果操作同一个数据库且访问参数也一样,可复用一个”Link”。Notes Pump 还提供了”Link”测试程序-LNKTEST.EXE,它是一个DOS环境下的命令行程序,其使用方法为:

—-D:\LNPump >LNKTEST[OPTIONS]<link1>[<link2>…<linkn>]

—-其中参数只有一个”-p”用来显示”link”的属性。在创建”Link”和”Activity”时经常要用到下面的Notes 数据和RDBMS的常用术语对照表。

n010_1.jpg (28767 bytes)

三、实现数据传输

—-下面用一个简单的例子来说明Notes Pump 的使用方法,即把在Notes 中创建的文档通过Pump 传到另一台Netfinity7000上的DB2数据库中去。然后分别用Direct Transfer和Scripted 两种”Activity”实现上述任务。

—-在DB2SERVER(系统)-DB2(实例)-SAMPLE(数据库)-USERZOU(模式)-STUDENT(表)中只有三个字段:Name(Character 10)、Sex(Character 4)和Age(Integer),其中主关键字为Name,无外来关键字和检查约束,且三个字段均设为非空。

—-在Domino Server的student.nsf数据库中有一名为”stuinfo”的表单,与DB2中的表对应也有三个域:学生姓名(Name)、性别(Sex)、年龄(Age)。

—-1.Direct Transfer Activity

—-在Notes 工作台上打开Pump Administrator数据库,首先创建两个”Link”-DB2STUDENT、NOTESSTU,其内容分别见下图:

n010_2.jpg (28410 bytes)

n010_3.jpg (32878 bytes)

—-在此基础上再创建Direct Transfer Activity,在工具条中选择”创建”-”Activity”-”Direct Transfer”即可打开与之相对应的表单,见下图:

n010_4.jpg (48555 bytes)

—-依次选择”Select Metadata”和”Map Fields”按钮建立两表之间字段的对应关系,存盘后直接点击”Run ASAP!”即可激活该”Activity”进行数据传输,也可用”Schedule”精确定义激活的时间。

—-2.Scripted Activity

—-如果需要在数据传输过程中进行更多的干预,就必须使用Scripted Activity。Script 是Lotus Notes 提供的脚本语言,用以编程实现复杂的工作流,Notes Pump 在此基础上又增加了专门用于数据传输的类库。所谓Scripted Activity就是使用Script 语言和Pump 扩展类编写Agent(代理),Activity被激活后告知Pump Server执行指定的Agent,实现复杂的数据传输。Agent可存放在Pump Script Vault或其他Notes 应用数据库中。下图是Scripted Activity表单样例:

n010_5.jpg (43050 bytes)

—-以下是Agent-send的Script 原程序:

 OptiOn Public   OptiOn Explicit   
Uselsx"*Inplsx" '引入   Notes Pump 的LotusScript Extensions   
Public Const Activity_name="script_dirstu"   'Scripted Activity表单名   
Public Const Source_link="NOTESSTU"   '两个Link表单名   
Public Const Destination_link="DB2STUDENT"   
Public Const Selection_statement=select@all   '传送Notes 中的全部记录   
Public Const Destination_metadata="USERZSD.STUDENT"   '定义两个Metadata   
Public Const Source_metadata="stu_info"   
Sub Initialize   On Error Goto LSErrorLabel   '如出错则转至错误处理语句
 Dim State As NPActivity   '用已定义的Scripted表单   
Set State=New NPActivity(0,Activity_name)   '创建一个"活动"   
Dim Source As New NPConnect(0,Source_link)   '建两个"连接"   
Dim Destination As New NPConnect  (0,Destination_link)(源和目的)
Dim fieldlist As New NPFieldlist(1,NPFIELDF_TRUNC_PREC)
Dim insertlist As New NPFieldlist(1,NPFIELDF_TRUNC_PREC)   '定义几个"域表"   
Dim count1 As Long   Source.Metadata=Source_metadata   '建立源和目的数据对应
 Destination.Metadata=Destination_metadataSource.Connect   '建立源和目的数据连接    
Source.Execute Selection_statement,fieldlist,count1    
If((count1=0)Or((count1=NPCOUNT_UNKNOWN)And  (fieldlist.GetCount()=0)))Goto ResumeLabel   '如无待传文档则跳转    
Set insertlist=fieldlist    Source.Fetch insertlist,1,1,count1   '从待传文档集中取一个至"域表"insertlist    
While(count1>0)    Destination.Insert insertlist,1,count1,NPNULLHANDLE   '插入目的数据库    
Destination.Action NPACTION_COMMIT   '更新目的数据库    
Source.Fetch insertlist,1,1,count1   '从待传文档集中取下  一个文档直到全部传送完毕    
WendSource.Disconnect '断开连接    Destination.Disconnect    
Goto ResumeLabel    LSErrorLabel:    
Dim MessageString As String    
MessageString=Error $&"at line"&Cstr(Erl())    Print MessageString   
 Resume ResumeLabel    ResumeLabel:    End Sub

 


 



【版权说明】:本网页上有部分内容来源于网上收集,但不能保证资料的完整性和准确性,仅提供参考和学习。如有侵权请立即通知我们,我们将立即删除,谢谢合作!

Add A Comment