Just some sharing about java open source and life

数据迁移的一些总结

日期:2010-07-17 00:28 | 作者:JavaChen | 分类目录:Post
153 views

做了一段时间的数据迁移工作,遇到了不少问题,积累了一些经验,现将自己在这段时间的工作总结与体会记录下来,为以后的数据迁移增加经验!
第一次执行数据迁移程序的时候,发现代码执行效率低,虚拟机占用内存太大,于是就想办法提高代码运行效率并增大java虚拟机内存(设置参数:-Xms300m -Xmx512m).
在代码效率上,做了以下一些改进:
1. 原来的迁移类中都是一个dao创建一个Session,原本是一个原子操作的事务被分为了多个事务,持久化对象被存在了多个Session中,造成了保存对象时候只能使用merge(数据迁移开发初期遇到此问题);
2. 原来的操作是先删除新表中的对象(业务表),然后在执行savOrUpdate方法,这样的话数据库会先select在insert或update,增加了数据库的查询次数,后来改变为先用sql语句删除新表中的数据记录,然后执行代码,代码中保存数据用save(新表中无数据,直接insert).
3. 原来类中存在多个dao,在执行crud操作之后连接都没有关闭.
4. 原来迁移明细表时候,会关联主业务表查询一些字段,采用的是”in”语句,后来改完在分页sql语句中用两表左外连接查询.两者效率谁高谁低?好像是后者!
5. 将一些经常用到的方法,如取销售类型的名称对应的id,取专用线的名称对应的id等等操作放到DataImport类中,类加载时候一次取出对应数据,在内存中操作,减少数据库查询操作.
6. 将导出销售表的java类分切为多个java类,减小表与表之间的关联性。一个类分为多个类的好处是,当从某一张表中导出销售记录时如果报错,就只需要重新从这张表中导出销售记录。不需要像以前7张表一起导出销售记录。(改进时间:2010-07-07)

数据迁移中遇到一些问题:
1. 表与表之间存在依赖关系,必须先导某一个表再导其他的表,导某一个表时候出现异常程序终止,整个程序就必须重新执行.整个数据迁移完成需要2个多小时,如果出现一次异常,则再此重新执行程序,这样会花费大量的时间.解决此问题的方法是:在迁移的基类中限制导出的记录条数,如只导5条,让整个程序跑一遍(只需几分钟),这样就可以整体检测代码在运行中是否会出现异常(一般是rs.getXXX(“”)时候会出现列名不正确的异常).
2. 数据迁移的过程中,数据库表字段不停的增加或修改,对应的实体类(get set方法)没有和数据库同步,给迁移工作造成一些麻烦.
3. 由于对业务不熟悉,导致一些字段取值错误,一些字段没有导到新表中,也有一些新表中字段无法直接与旧表对应,需要关联主业务表查询,之前没有考虑到这种情况,所以有一些新表中的字段没有取到对应的值.
4. 在多次迁移的过程中由于网络连接不稳定以及一些人为的原因,导致数据迁移程序执行一部分的时候,程序因数据库连接中断而停止运行,当然也因为自己的一些疏忽,程序因出现异常而中断运行.
5. 尝试过在本机导数据,以为可以把本机导出的数据导入到服务器上去,但是忘记了本机上的oracle版本为10g——–10g的数据库文件无法导入到9i数据库中!在自己的电脑上导数据库要比台式机快至少半个小时!
6. 在另外一台机子上安装9i数据库,打补丁,并执行导出操作,遇到oracle 9i内存池不够的问题,解决该问题需要修改oracle 9i的配置参数(2010年07月07日导数据遇到此问题)。

关于数据比对:
之前李博士采取的比对方式是:在新旧系统中查询某一相同时间段中的数据总数是否相同,没个字段是否相同,这样的比对方式非常直接,但是比对的不完全,因为在页面上不可能把表中的所有字段显示到页面上去.

作者:JavaChen | 分类目录:Post | 标签:
回到顶部

无觅相关文章插件,快速提升流量