|
Domino連接池解決方案 |
|
|
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(""+strname+" | ");
strHtml.append(""+strgeneral+" | ");
strHtml.append(""+strbir_year+"年"+strbir_month+"月"+strbir_day+"日"+" | ");
}
strHtml.append(" ]");
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){
}
}
}
}
|
|
|
|
|
|
|
|
|
|
|