Lotus Domino和关系型数据库(LEI,DESC,JDBC连接)
Domino和关系数据库进行交互是日常项目开发中经常涉及到的一个方面,每个domino开发人员都写过这样的程序,本文就这个方面做一下简单的总结。 一、工具篇 1、使用LEI(Lotus Enterprise Integrator) LEI的英文全称是Lotus Enterprise Integrator ,它是以前大家熟知的NotesPump的升级产品,是基于服务器的数据分布产品,提供了定义和管理以下事物的环境: *大量的数据交换 *数据同步 :事件驱动和实时的数据传输 LEI服务器处理指令,建立到外部数据源的连接,按照定义好的活动的条件来传输数据.它要求Domino 4.6x 或 5.x以上版本的服务器,可以单独运行,也可以作为一个内部的服务器任务运行. Lotus Enterprise Integrator (LEI) 6.x 可以将附件从 Domino 数据库移到 RDBMS 表中,从而可以从 RDBMS 内读取这些附件。更重要的是,此项操作可以快速进行,而不需要编写任何脚本代码。关于此方面,IBM官方网站上有对此操作的详细步骤说明,有兴趣的同行可以阅读一下,链接:http://www.ibm.com/developerwork ... achments/index.html 2、DESC(Domino Enterprise Connection Services ) DECS的英文全称是Domino Enterprise Connection Services ,是LEI的子集,它仅仅是实时的Notes活动.DECS是一个基于向导器的服务器任务,包含于Domino 4.6.3及其以后的版本.它修改NOTES.INI文件以包括实时的扩展:extmgr_addins=ndecsext.dll (for NT) 下面,介绍一下DECS的用法,本文将以一个非常简单的例子为大家说明一下使用过程,更复杂的使用,大家可以据此做更深入的研究。我们以用notes导入一个Access数据库为例(该数据库已注册到ODBC中) 预备工作: 保证有你要导入的Notes数据库。 保证有Access数据库 保证ODBC已经加入该Access数据库数据源。 第一步: 如果你是第一次使用DECS,请查看你的服务器的DATA目录下是否有decsadm.nsf的数据库,如果没有这个数据库,要以Domino自带的名为decsadm.ntf的模板建立本数据库,关于DECS的相关设置都会在本数据库中进行。 第二步: 在服务器的控制台上输入Load DECS, 第三步: 任务启动后,打开服务器上的Decsadm.nsf数据库。 第四步: 单击"Create Connection",创建一个连接。选择你要创建的数据库类型(DB2,Or I acle,ODBC)。本例选择ODBC. 第五步: 打开连接表单后: 表单中有以下几项: Data Source:输入数据源。 本例中输入ODBC中你要连接的数据源的名字。 Username:输入能访问该数据源的用户名。 Password: 输入能访问该数据源的用户密码 Password encryption key:单击后对你填入的用户密码,在Notes中加密。 Selection Type:你选择的类型是Table ,还是View :选择Table的拥有者。 Name: 选择你要连接哪一个Table. 填完后保存退出。 第六步: 单击"Create Activity",创建一个"动作"。系统提供了一个动作向导,单击"Create Activity",系统打开表单后弹出一个动作向导,如果你确定使用的话,单击"确定"。 选择你要导入到哪个Notes数据库。 选择你要导入到该数据库的哪个表单。 选择你使用哪个"连接"(第四步创建的) 选择你到导入外部数据库的哪个Table和View. 这时会出来Key和数据域的映射。 Key:是你的主索引。 Field:是你要分别对应的字段。 在左边选择Notes的域,右边选择外部数据库的字段。 选择你对外部数据库的动作Open,create,update,delete 输入你为该导入动作取的名字。然后保存关闭当前文档。 第七步: 1.查看"Activities"导航,选定你要激活哪个"动作" 单击"Start",启动该动作。 如果不成功,你单击"log",如果你想停止该动作请单击"Stop" 图标说明:第一个图标表示该动作没激活,第二个图标表示动作正在激活,第三 个图标表示动作已激活。 第八步: 1.打开你要导入的Notes数据库,用你刚才第六步第2点的表单创建文档。 在你对应KEY的域中输入输入外部数据库的某一个数据。如:如果我把Access 数据库中table的ID字段作为key,而对应notes中的test域,那么我们就应该在test域中输入:如:"10203" 保存当前该文档。 第九步: 在视图中打开刚才创建保存的Notes文档。我们就会发现在其他映射的域都会出现 对应在外部数据库中的数据。这样外部数据库中的数据就引入到了Notes中了。 DECS与LEI存在一定的区别,大致可以概括为: 1 LEI提供了一个多功能的数据访问工具集,可以对其编程;DECS仅限于事先定义好的功能;2 LEI能处理大规模的数据传输,DECS仅工作在文档级;3 LEI 能适用于两个非Notes的数据源,DECS要求Notes作为一个数据源。 3、和DB2的数据交互 Domino在发布版本7的时候,就提供了Domino和DB2的数据集成功能,只是在这个版本上,IBM也只是做一下尝试,并不对此项功能进行技术支持以及其它的相关服务,随着Domino8的发布,IBM官方声明Domino8已经支持这个功能了,个人感觉,这里与其说是和DB2的数据交互,不如叫和DB2的数据共享。按照IBM提供的相关帮助文档,进行正确的配置以后,就可以达到将所有Domino的数据移植到DB2中,使Domino中的数据库只剩一个躯壳,所有真正的数据都存在DB2中,我查看了一下,这样配置之后,Domino中的数据库仅剩10几个字节,但是对用户来说,没有任何变化,这个功能非常强大,只可惜目前只支持DB2关系数据库,毕竟数据库也是人家自己的东西,也许在不久的将来会支持其它流行关系数据库吧,期待ing!对于这方面的使用,大家仔细参考帮助照做即可,这里就不多说了。 二、程序篇 1、使用ODBC 使用这个解决方案的前提条件,下面两个条件必具其一: a、程序是运行在客户端,即:CS模式,且客户端所在操作系统是window系列; b、程序运行在服务器,且服务器所在操作系统是windows系列; 本解决思路主要是使用Domino提供的三个类:ODBCConnection、ODBCQuery、ODBCResultSet,暂时手头上还没有这方面的例子,所以就不提供了,如果有的兄弟,请发上来,我编辑到本文章中,提前谢了。大家同样可以参考Designer的帮助,找到一些启示。 2、使用JDBC 一般情况下,不建议在Domino编程中使用java,这个众所周知,Lotus对Java的支持实在不敢恭维,但是如果受客观条件的限制,只能用JDBC,那就没办法了,比如我们公司,bs结构,服务器所在操作系统是Solaris,使用工具肯定不会去考虑,也不具备使用ODBC的条件,只能赶鸭子上架了,不过一般情况下,如果程序比较健壮,对于一些java对象做了合理的释放,短期内应该不会出现什么问题。言归正传,使用步骤: a、找到oracle的jdbc驱动包:class12.jar; b、或可在建立代理后,直接在设计端引入该jar包;或将该jar包上传到服务器,修改Notes.ini文件,增加JavaClasses参数进行引入; c、下面给出一小段代码,这个相信大家也都很熟悉了,就不多说了,不过多一嘴,如果确认你所有的步骤都操作正确,java代理还是不能正确运行的话,可以尝试将代理的安全限制设置为:允许受限操作。 import lotus.domino.*; import java.sql.*; public class JavaAgent extends AgentBase { public void NotesMain() { Connection conn = null; Statement stmt = null; ResultSet rs = null try { Session session = getSession(); AgentContext agentContext = session.getAgentContext(); Class.forName("oracle.jdbc.driver.OracleDriver"); String url = "jdbc racle:thinIP地址:1521 ROD"; String user = "***"; String password = "***"; conn = java.sql.DriverManager.getConnection(url,user,password); stmt = conn.createStatement(); String sql = "select * from ra_salesreps_all"; rs = stmt.executeQuery(sql); while(rs.next()){ System.out.println(rs.getString("name")); } } catch(Exception e) { { e.printStackTrace(); }finally{ try{ rs.close(); stmt.close(); conn.close(); }catch(SQLException sqle){ System.out.println(sqle); } } } }