数据库从oracle移植到mysql改动说明:
后台服务系统改动
1. 数据库连接配置文件:
文件路径:
\Src\server\ src\main\cn\banking\view\server\config\hibernate.cfg.xml
注释掉oracle连接的属性,打开mysql的属性,连接采用的驱动为:
com.mysql.jdbc.Driver ,导入了jar包。
2. 代码改动:
1) 新加了类ReplaceDBProc.java 完成存储过程(Sp_Sync_Log,Sp_Clear_Data)功能的。
2) 类cn. banking.view.server.timertask.SynTxnLog.java调用存储过程改为调用ReplaceDBProc.java类中的方法。
3) 新加类 cn. banking.view.server.timertask.SpClearData.java完成定时调用ReplaceDBProc.java类中代替存储过程Sp_Clear_Data的方法。
4) 在类cn. banking.view.server.OVSMonitor.java中新加了定时任务:
SpClearData sp = new SpClearData();
sp.run();
l_oTimer.schedule(sp, 86400000, 86400000);
另:Sp_Sync_Log存储过程以移植到mysql下,经测可用。Sp_Clear_Data由于后来改成代码实现,没有移植,这个存储过程在oracle中是通过job定时执行的,在mysql中可以通过event(事件)来完成。自己认为同样的情况下,利用数据库执行一定的任务性能会比java代码效率高。要定时的调用任务在java代码中要开辟线程,并且还是不断的新加和数据库的连接,这样会影响性能。
Web服务代码改动说明:
1. 连接数据库属性改动:
数据库配置文件:
\Src\website\ff \src\jdbc.properties
修改同后台服务的修改。
2. Oracle中的to_date()和to_char()函数在mysql中没有对应的函数,必须全部去掉,改动方法:
to_date('2013-09-09 12:12:12','yyyy-mm-dd hh:mm:ss');直接改为'2013-09-09 12:12:12'即可。to_char()做同样的修改。在类中搜索to_date()和to_char()可以看到修改的地 方,也可以搜索"颜志军"来查看修改的代码。主要修改的类:
cn..view.pack.service.impl.PackInfoMgrImpl.java。在搜索to_date()的时候有些是框架自定义的函数,有些是以前的版本中和ATM相关的,要查看之后才能修改。
3. 在cn..view.pack.service.impl.PackInfoMgrImpl.java中,拼接HQL语句出现的bug,action传过来的值放在HashMap中,而HashMap的key值是没有固定顺序的,对于一般的字段没有问题,但是对于结束时间和开始时间就会出现bug。在原来的代码中是这样把开始时间和结束时间拼接在HQL语句中的,原来的代码:
if (key.equals("beginDate") && !value.equals("")) {
sb.append(" and packInfo.outdate >= ? ");
obj[0] = Timestamp.valueOf(value);
types[0] = Hibernate.TIMESTAMP;
}
if (key.equals("endDate") && !value.equals("")) {
sb.append(" and packInfo.outdate <= ? ");
obj[1] = Timestamp.valueOf(value);
types[1] = Hibernate.TIMESTAMP;
}
由于在每次执行的过程中,beginDate和endDate map中的顺序不同, 拼接成的HQL语句将会有两种形式:
and packInfo.outdate >= ? and packInfo.outdate <= ?
这中形式在执行的过程中是正确的,因为在查询的过程中传的参数为obj,刚好obj[0]对应的是开始时间,obj[1]对应的是结束时间。而要是在map中endDate在前的话,拼接后刚好相反
and packInfo.outdate <= ? and packInfo.outdate >= ?
此时obj中obj[0]还是开始时间,obj[1]为结束时间,而当执行的时候就会把开始时间传给 <= ,结束时间传给 >= ,这样就会查不出数据。
修改方法:
在判断的过程中,先只是给obj赋值,在while循环结束之后,再通过判断拼接HQL语句,代码如下:
while(){
if (key.equals("beginDate") && !value.equals("")) {
// sb.append(" and packInfo.outdate >= ? ");
obj[0] = Timestamp.valueOf(value);
types[0] = Hibernate.TIMESTAMP;
}
if (key.equals("endDate") && !value.equals("")) {
//sb.append(" and packInfo.outdate <= ? ");
obj[1] = Timestamp.valueOf(value);
types[1] = Hibernate.TIMESTAMP;
}
}
if (obj[0] != null) {
sb.append(" and packInfo.outdate >= ? ");
}
if (obj[1] != null) {
sb.append(" and packInfo.outdate <= ? ");
}
另外再while循环中,用if判断key值,没有用else if,这样每次都需要和每个if判断,影响效率,应该加上else if。
4. 在类
cn..view.pack.dao.hibernate.PackInfoDAOHibernate.java 283行,执行批量更新函数bulkUpdate()的时候出现异常,在执行前加上
this.getHibernateTemplate().clear();
可以解决此问题。这个应该和hibernate的映射有关系,在Pg_Log的映射文件中,映射的主键为
<id
name="traceno"
type="java.lang.String"
column="C_TRACENO"
>
而在数据中并没有设置C_TRACENO为主键,在执行bulkUpdate的过程中跟踪打印出的sql语句的where后面的条件只有C_TRACENO,没有加上别的条件,这样就会报异常,因为我只想更新一条,而实际更新的过程中更新了两条。同样的情况在oracle中不会报异常,但是在数据库中也是更新了两条记录。报不报异常可能和连接数据库的驱动程序有关系。虽然更新了两条记录,但是没有影响系统的正确性。我在想在开发的产品中是不是经常会有"可以原谅的错误"。
5. 数据库的兼容性
在移植的过程中用的数据库版本是mysql5.5的,在如果varchar中存的是数字,查询的时候加上单引号''可以查询,而当我移植在mysql6.0版本的时候就会出问题。所以对于char和varchar类型要正确的使用。
还有时间的兼容性,运行的过程中可能回报不能查询的异常,根据以前运行的判断,最有可能是时间格式的问题,应该把相应的时间格式在数据库中改为 timestamp。
6. 系统的设计
每个用户都是属于一个区域的。那么当这个用户登录后要删除或者修改自己所在的区域的时候就会出错误。还有在实际安装的过程中,当用户要删除默认的最高级区域而建立新的区域的时候也会出现问题,所以最顶级的区域只能修改,不能删除,区域代码不能修改。
7. 性能优化
根据服务器的配置修改配置文件mysql目录下的my.ini来提高性能。