配色: 字号:
Domino連接池解決方案
2014-04-24 | 阅:  转:  |  分享 
  
Domino连接Oracle解决方案

前言

本文只简单介绍了Domino与Oracle交互的基本方法,没有设计到复杂的技术。文中使用了连接池,在本文中并没有具体介绍连接池的设计方案,在下一篇文章中将会就具体连接池设计方案作个说明!本文只做技术探讨之用,对文中的错误欢迎指正。





应用背景

在Domino中开发应用程序经常要存取一些关系数据库中的数据,在以前的Domino系统中除了使用昂贵的LEI,再有就是ODBC了(谁还用过其他的工具?)。但是就像社会在不断进步一样,Domino也在不断进步。在IBM推出Domino6.0后,一切似乎都在改变!IBM似乎意识到了Domino与其他系统交互数据的重要性,在Domino6.0中增加了DCR,DECS,当然LEI还是在跟进。虽然Domino6.0的数据整合功能更加强大了,但有一点,都是通过配置来实现与其他数据库的交互。配置的好处就是,点几下鼠标,建几个文档一个应用就OK了,根本不需要复杂的编程,繁琐的测试。缺陷就是不够灵活,往往这些配置类的工具不能满足我们的需要,或者这些工具本身有缺陷,造成我们需要过多的人工维护,比如DECS。当然,我们的需求不同,要求就不一样,在我做的项目里DECS和lEI并不能满足我的要求,DCR只能与DB2关联,不是我需要的。因此我的这篇文章里所讲的方法并不一定适合您。好了,继续。

既然这些工具不能为我所用,那我们就想办法通过其他途径达到我们目地。幸好在Domino6以后对Java的支持力度增强了,可实现的功能增多了,给我们选择的方法也多了。

我就想一个问题,以前我做项目需要存取其他数据库中的数据,只能利用Windows平台的ODBC驱动。这么做的代价就是只能在Windows平台上部署应用,而不能用类Unix系统,这就好像被人束缚了手脚一样。我的要求是能跨平台,这么一来就只有一个选择了—JDBC。

这并不奇怪,当今企业应用中只有JDBC和ODBC两种跨数据库连接技术,非彼即此,倒也没什么可选的,不过在跨平台这一项上,只有JDBC才能胜任。那么怎么才能让Domino使用JDBC驱动呢,其实也很简单。大家跟着我一步一步去做,一样能办到。以下开始切入正题。

二.实际操作

1.准备开发环境

现说一下开发环境:

Domino平台:Domino6.5.5

操作系统:AIX5.3

数据库:Oracle9.2.0.8

开发工具:LotusDesigner+Eclipse

大家也可以在自己的机器上试验Domino6.5.5+WinXp+MySQL的组合,完全可以实现。

准备Oracle的JDBC驱动classes12.jar,将Jar包拷贝到Domino程序目录下的jvm/lib/ext目录下,然后重启Domino服务器。好了在你的程序中可以使用JDBC驱动了,很简单吧!

2.新建Domino设计元素

现在我开始实际的操作。新建一个数据库jdbctest.nsf,然后在新建一个表单frmjdbctest

,在表单中新建几个字段,和两个按钮。如图



下图是在IE浏览器中的样式。



3.在Oracle中新建表

新建jdbctest表,包含字段fld_name,fld_general,fld_birthdayyear,fld_birthdaymonth,fld_birthdayday



4.编写程序

编写两个代理agtDominoToOracle(附件一)和agtOracleToDomino(附件二)

按钮“存数据”触发代理agtDominoToOracle。

按钮“取数据”触发代理agtOracleToDomino。

5.运行程序

先在表单填写数据,然后点击“存数据”按钮。

然后点击“取数据”按钮现实存在Oracle中的数据。

这是通过pl/SQL取的数据,如下图



在Domino中输入的数据已经存进Oracle中,而Domino中没有任何数据保存。



下图是点击“取数据”按钮,得到的Oracle中的数据





小结

通过以上步骤大家应该可以看到Domino与Oracle甚至是其他数据库的交互其实很简单,这并不是什么高深的技术,本文的目的也是抛砖引玉。希望大家都贡献出自己的智慧,让我们共同努力,Domino的明天会更好!





















附件一:代理agtDominoToOracle源程序

importlotus.domino.;

importjava.sql.;



importcom.sinosoft.dao.PoolManager;



publicclassagtDominoToOracleextendsAgentBase{



publicvoidNotesMain(){

Sessionsession=null;

AgentContextagentContext=null;

DocumentdocContext=null;



StringBufferstrSQL=null;

Stringstrname=null;

Stringstrgeneral=null;

Stringstrbir_year=null;

Stringstrbir_month=null;

Stringstrbir_day=null;

Connectionconn=null;

Statementstmt=null;

intiUpdate=0;



try{

session=getSession();

agentContext=session.getAgentContext();

docContext=agentContext.getDocumentContext();



//下面这段程序,大家可能不太明白了,这是取连接池

PoolManagerpm=PoolManager.getInstance();

conn=pm.getConnection("platform");



//下面这段是采取直连方式访问Oracle

/

Class.forName(strDbDriver);

conn=DriverManager.getConnection(strDbURL,strUser,strPasswd);

/



if(conn!=null){

stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

//

strname=docContext.getItemValueString("fld_name");

strgeneral=docContext.getItemValueString("fld_general");

strbir_year=docContext.getItemValueString("fld_birthdayyear");

strbir_month=docContext.getItemValueString("fld_birthdaymonth");

strbir_day=docContext.getItemValueString("fld_birthdayday");



strSQL=newStringBuffer();

strSQL.append("INSERTINTOJDBCTEST(FLD_NAME,FLD_GENERAL,FLD_BIRTHDAYYEAR,FLD_BIRTHDAYMONTH,FLD_BIRTHDAYDAY)");

strSQL.append("VALUES(''"+strname+"'',");

strSQL.append("''"+strgeneral+"'',");

strSQL.append("''"+strbir_year+"'',");

strSQL.append("''"+strbir_month+"'',");

strSQL.append("''"+strbir_day+"'')");



iUpdate=stmt.executeUpdate(strSQL.toString());

}









}catch(Exceptione){

e.printStackTrace();

}finally{

try{

if(docContext!=null){

docContext.recycle();

}

if(agentContext!=null){

agentContext.recycle();

}

if(session!=null){

session.recycle();

}

if(stmt!=null){

stmt.close();

}

if(conn!=null){

conn.close();

}



}catch(Exceptione){



}

}

}

}





附件二:代理agtOracleToDomino源程序



importlotus.domino.;

importjava.sql.;



importcom.sinosoft.dao.PoolManager;



publicclassagtOracleToDominoextendsAgentBase{



publicvoidNotesMain(){

Sessionsession=null;

AgentContextagentContext=null;

DocumentdocContext=null;



StringstrSQL=null;

Stringstrname=null;

Stringstrgeneral=null;

Stringstrbir_year=null;

Stringstrbir_month=null;

Stringstrbir_day=null;

StringBufferstrHtml=null;

Connectionconn=null;

Statementstmt=null;

ResultSetrs=null;



try{

session=getSession();

agentContext=session.getAgentContext();

docContext=agentContext.getDocumentContext();

System.out.println("run");

//下面这段程序,大家可能不太明白了,这是取连接池

PoolManagerpm=PoolManager.getInstance();

conn=pm.getConnection("platform");



//下面这段是采取直连方式访问Oracle

/

Class.forName(strDbDriver);

conn=DriverManager.getConnection(strDbURL,strUser,strPasswd);

/



if(conn!=null){

stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

strSQL="SELECTFROMJDBCTEST";

rs=stmt.executeQuery(strSQL);

strHtml=newStringBuffer();

strHtml.append("[");

strHtml.append("");

strHtml.append("");

strHtml.append("");

while(rs.next()){

strname=rs.getString("fld_name");

strgeneral=rs.getString("fld_general");

strbir_year=rs.getString("fld_birthdayyear");

strbir_month=rs.getString("fld_birthdaymonth");

strbir_day=rs.getString("fld_birthdayday");

strHtml.append("");

strHtml.append("");

strHtml.append("");

}

strHtml.append("
姓名性别生日
"+strname+""+strgeneral+""+strbir_year+"年"+strbir_month+"月"+strbir_day+"日"+"
]");

docContext.replaceItemValue("disOracledata",strHtml.toString()).recycle();

}





}catch(Exceptione){

e.printStackTrace();

}finally{

try{

if(docContext!=null){

docContext.recycle();

}

if(agentContext!=null){

agentContext.recycle();

}

if(session!=null){

session.recycle();

}

if(stmt!=null){

stmt.close();

}

if(conn!=null){

conn.close();

}



}catch(Exceptione){



}

}

}

}

献花(0)
+1
(本文系Lotus开发首藏)