码迷,mamicode.com
首页 > 编程语言 > 详细

【java】itoo项目实战之减少IO读写的导入思路

时间:2015-06-18 19:51:07      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

       一个系统不管是大还是小,都是缺少不了导入导出的,一个系统如果拥有导入功能,能够带了很大的方便.因为itoo系统的各个系统都需要导入功能.由于我之前一直对导入有一定的研究,这个公共功能就落到的头上了.我主要是给大家介绍下我导入的整个思路以及后来的优化方案.

导入的整体思路可以用一下这张图来解释:

技术分享

第一步是需要把填充好数据的excel转换为list集合.

第二步是把List集合批量保存到数据库相对应的表中.

以上是如何把填充好的excel导入到数据库中相对应的表的过程.

技术分享

      上面这张图主要介绍的是如果把一个excel转换成为一个List,主要要做的是那些操作.

      检查Execel 数据是否重复:因为Excel中的数据填写是人为的,总是会有不小心填写了重复数据的时候,这个时候就需要检测填写好的Excel是否有重复数据,出去重复数据在后面的操作.这个步骤的主要目的是保证Excel中的数据不重复.

      检查Excel数据是否在database中已存在:这个步骤主要是确保保存的数据和database的数据不重复,避免脏数据的出现.这个步骤是需要和数据库进行交互的.

      处理含有主外键关系的数据:这个步骤也是需要和数据进行交互的.有时候导入的数据是和其他表有相关的,为了保持数据的一致性,在数据库中保存主外键关系的主键,而在Excel中填写的时候外键的名称,所以就需要在内部进行转换.

      以行为单位把数据保存到list中:保存数据到list中,是先把Excel的数据一行行的分割,在List中,每行的数据保存到Object对象中,Object 对象的个数由符合条件可以保存到数据库中的行数决定.

      以上的主要是介绍如何把一个Excel 转换成一个List 所需要的步骤.其中检查Excel数据是否存在Database 中是否存在和处理主外键关系这两个步骤是需要和数据库交互的,可以用以下这张图来表示:

技术分享

      以上图表示的是每一行转换成list的过程中,都需要和数据库交互两次,如果有10条数据,需要和数据库交互的次数就是20次.数据量小的时候,导入的数据并没有多大的感觉,反正是一会就结束了,但是当数据量增加的2万条的时候,就是真的把IO读写太多导致系统过于慢发挥到极致了.就给大家说个例子,有次需要导入2万条学生的数据进入系统中,因为我对系统比较熟悉,所以经理就让我导入进去,我拿到数据的时候就兴致勃勃的开始工作了,但是转了好久,数据都没有导完,在看电脑的CPU,都到了爆红的状况了.看到这种状态我就默默去优化导入功能了.我优化的思路可以用下这张图来解释:

技术分享

第一步:我先把数据表的数据提前查询出来,然后放到Map中.

第二步:检查Excel 数据库是否存在Database中是否存在 的时候,直接用提前查询放在Map中数据进行比较.

第三步:处理主外键关系的时候直接用提前查询放在Map中的数据既可以,不在需要查询数据了.

      做了以上的优化,如果需要处理3个主外键关系,以1列的数据来确定是否在数据库中重复,这样只需要和数据库交互4次,无论数据是10条还是10万条数.需要IO读写只需要4次.


      现在问问自己,为什么当初做的时候,会有那么多的IO读写呢?

      当做导入功能的时候,是以完成为准,做出来就好,没有想过怎么做可以减少IO操作,如何大数据量的话,这个导入功能会不会慢呢? 这些问题的出现,都是因为自己缺少一种全心全意为人民服务的胸怀,缺少一种谋全局的胸怀,心里的最深处小富即安的小农思想没有剔除掉,还在时刻的影响着自己.想要做一款好的软件,就先为别人着想开始.

【java】itoo项目实战之减少IO读写的导入思路

标签:

原文地址:http://blog.csdn.net/tang_huan_11/article/details/46550575

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!