最近在做一个项目中,需要将原来在DB服务器中的处理移植到online上来。
这样就导致存在一个问题:要将在DB服务器中的调用数据库方式转换成Web服务器中的调用数据库方式。
整理下思路,我想到以下的实施方法:
1,首先在Web服务器中,新写个shell程序,在shell中调用java class。
2,在java class中调用serviceFactory生产的service class,得到DB用的service类
3,得到service类就可以操作数据库,完成数据的查询更新等处理了。
下面具体来针对以上的步骤中要注意的事项说明一下:
步骤1:
.shell文件中要用setenv 命令把后面要调用的java class要使用的java包,以及class全部声明下。
.要注意如果自己要把java文件打成jar包的话,要从src目录下开始做,譬如你的代码结构是
src
|_com
|_|_cn
| |_daig
|_jp
那要在src目录上层,将scr目录下的代码全部打包。打包命令:jar cvf src.jar src(当前目录下)
顺便说下解压命令:jar xvf scr.jar
.最重要的JAVA_HOME 要setenv,然后使用${JAVA_HOME}/bin/java -Xms100M -Xmx1000M co.cn.daig.Test(全路径class类)
步骤二:
.我们在web服务器中使用的sqlmap.xml中使用的是jndi方式。
但是我们从shell启动java的时候就获取不了这个jndi了,我们只能使用其他的方式,譬如SIMPLE方式。否则可能会报出如下exception:
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an
< transactionManager type ="JDBC" >
< dataSource type ="SIMPLE" >
< property name ="JDBC.Driver" value ="oracle.jdbc.driver.OracleDriver" />
< property name ="JDBC.ConnectionURL" value ="jdbc:oracle:thin@192.168.1.1:1500:testDB" />
< property name ="JDBC.Username" value ="user" />
< property name ="JDBC.Password" value ="mypass" />
< property name ="Pool.MaximumActiveConnections" value ="10" />
< property name ="Pool.MaximumIdleConnections" value ="5" />
< property name ="Pool.MaximumCheckoutTime" value ="120000" />
< property name ="Pool.TimeToWait" value ="500" />
< property name ="Pool.PingQuery" value ="select 1 from ACCOUNT" />
< property name ="Pool.PingEnabled" value ="false" />
< property name ="Pool.PingConnectionsOlderThan" value ="1" />
< property name ="Pool.PingConnectionsNotUsedFor" value ="1" />
dataSource >
transactionManager >
还有在WEB服务器中我们online方式的时候,如果我们使用sqlMapPlugIn的方式来做DB access的初期化的话,
web服务启动的时候会加载struts-config.xml中的plug-in配置,本项目就是这种方式。
< plug-in
className = "cn.co.ibm.x1.ko.common.plugin.SqlMapPlugIn " >
< set-property property = "daoClassName"
value = "cn.co.ibm.x1.ko.common.dao.sqlmap.oracle.OracleDaoImpl"/>
如果我们是shell其中java的话,这个plugin配置肯定是读取不到了,当然也不会自动为我们加载了。
那么就需要我们在生产serviceFactory的时候,手动给sqlMapPlugIn类设定了
SqlMapPlugIn smp = new SqlMapPlugIn();
smp.setDaoClassName("cn.co.ibm.x1.ko.common.dao.sqlmap.oracle.OracleDaoImpl");
smp.init(null,null); 后续会附上代码。