如鹏网 大学生计算机学习社区

CowNew开源团队

http://www.cownew.com 邮件请联系 about521 at 163.com

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  363 随笔 :: 2 文章 :: 808 评论 :: 0 Trackbacks
      今天改完了bug就开始考虑起怎么优化数据导入的程序了。我们的系统构架要求客户端不能执行sql语句,所有的数据库操作都要通过ejb来实现。我这个数据导入就麻烦了,因为是大量数据的导入,如果采用ejb的方式一条一条的导入,速度会很慢。
    所以我采取了定义一个SessionBean,在SessionBean中定义一个executeSQL方法,接受两个参数,一个是sql语句(可能带参数),和一个参数值数组。这样客户端就可以直接通过sql语句操纵数据库了。但是问题也就来了,如果每条数据都调用executeSQL访问一次数据库,这样不仅会造成频繁的事务启动,速度很慢,而且由于各个数据库插入操作之间是在不同的ejb调用中进行的,所以无法保证事务。我优化的重点当然也就在这两点上。项目紧急,我不能对构架做太大的改动了,因为毕竟以前的实现方式可以导入数据了,我就琢磨着在不做大规模改动的情况下进行优化,将风险降低到最小。
    系统中所有ejb都是基于接口的,比如上边定义的executeSQL方法就定义在IImportDataFacade接口中,ejb实现这个接口,客户端通过工厂方法ImportDataFactory.getInstance()访问这个接口(ImportDataFactory.getInstance()返回IImportDataFacade类型)。好,我就从他下手。定义一个ImportDataDecorate类,让他也实现IImportDataFacade接口,它的executeSQL实现不是吧sql提交到数据库,而是把它缓存起来,等所有插入语句执行完毕后将缓存的sql语句一次性提交到我定义的一个新的接口方法中(此方法含有一个sql数组的发那个法),这样就可以保证事务和速度了。
    我是怎么实现对系统改动最小呢?对了,我只要把所有调用ImportDataFactory.getInstance().executeSQL()的地方替换成new ImportDataDecorate(ImportDataFactory.getInstance()).executeSQL(),哈哈,改动很小吧,而且一旦发现这种实现方式不可行,那么只要将ImportDataDecorate.executeSQL()的实现改成直接提交到数据库就好了,其他调用根本不用变。设计模式很伟大呀,只不过我都不知道我用的这是什么模式,Proxy 还是Decorator?不知道,反正解决问题了,呵呵。
posted on 2006-03-07 22:08 CowNew开源团队 阅读(998) 评论(7)  编辑  收藏

评论

# re: 数据导入优化经验 2006-03-08 12:08 ddd
改ImportDataFactory.getInstance()让返回一个decorated的接口不就行了.  回复  更多评论
  

# re: 数据导入优化经验 2006-03-08 12:36 Java & Delphi 联合王国
@ddd
ImportDataFactory类是公司的开发工具自动生成的,不能改,即使改了再次生成的时候也会被重新覆盖改成默认的形式,呵呵.所以只能这样做了
  回复  更多评论
  

# re: 数据导入优化经验 2006-03-09 09:23 insert&&modify
把它缓存起来,等所有插入语句执行完毕后将缓存的sql语句一次性提交到我定义的一个新的接口方法中?
搞不明白,你这里把它缓存起来,那就是说不和数据库交互了,你怎么保证事务啊?
  回复  更多评论
  

# re: 数据导入优化经验 2006-03-10 09:40 scorpional
弱弱的问一句,你的提交方法里面是不是就是做commit动作,但是这样没有立刻提交,能保证事务么?  回复  更多评论
  

# re: 数据导入优化经验 2006-03-10 20:12 Java & Delphi 联合王国
我执行的都是insert语句,在批量执行之前开始事务,执行完毕commit,执行错误就rollback,肯定能保证事务呀。难道我做的有什么不妥?请指教。
示意性代码:

beginTX();
try
{
for(int i=0,n=sqlcache.size();i<n;i++)
{
executeSQL(sqlcache.get(i));
}
commit();
}
catch
{
rollbakc();
}  回复  更多评论
  

# re: 数据导入优化经验 2006-03-11 10:10 scorpional
哦,明白了,学习!  回复  更多评论
  

# re: 数据导入优化经验 2006-06-02 16:01 霉干菜
定义一个ImportDataDecorate类,让他也实现IImportDataFacade接口,它的executeSQL实现不是吧sql提交到数据库,而是把它缓存起来,等所有插入语句执行完毕后将缓存的sql语句一次性提交到我定义的一个新的接口方法中(此方法含有一个sql数组的发那个法),这样就可以保证事务和速度了。


这个时候为什么不直接分布提交呢,而是再用一个方法合并sql数组 和sql语句呢,我感觉这部分合并不用去创建一个新的接口方法把? 还是照你这样作才能提高效率呢?
请指教.  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: