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

一个系统不管是大还是小,都是缺少不了导入导出的,一个系统如果拥有导入功能,能够带了很大的方便.因为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操作,如何大数据量的话,这个导入功能会不会慢呢? 这些问题的出现,都是因为自己缺少一种全心全意为人民服务的胸怀,缺少一种谋全局的胸怀,心里的最深处小富即安的小农思想没有剔除掉,还在时刻的影响着自己.想要做一款好的软件,就先为别人着想开始.

时间: 2024-08-29 06:12:45

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

【java】itoo项目实战之优化后具体代码

在我的前一篇博客中<<itoo项目实战之减少IO读写的导入思路>>,我介绍了如何完成减少IO读写的Excel导入,在这里我就把具体的代码实现分享给大家: 我就按照这张图的顺序给大家分享. 检查Excel 数据是否重复的代码: <span style="font-family:Times New Roman;font-size:18px;">// 2.从指定列中寻找重复行 for (int i = 1; i < realRows - 1; i++

【java】itoo项目实战之大数据查询之使用 new map 优化hibernate之级联查询

在我的上一篇博客<[java]itoo项目实战之hibernate 懒加载优化性能>中,我曾提到过学生数据有2万条,查询数据十分的慢,这是让人很受不了的事情,看着页面进度条一直转着圈圈,那种着急的感觉真的没法形容.最开始考虑着使用lazy 来优化,因为前台框架的原因,lazy 优化并没有起到什么左右,后来就想着有select new map 优化.我先来画画关于查询学生的级联树 这个树的意思就是查询学生的时候它的深度是4级. 在没有优化之前,使用的是hibernate的hql 语句:From

Java Drp项目实战——Drp知多少

是什么 Drp是Distribution Resource Planning的缩写,意思是分销资源计划,它是用来管理企业的运行于Internet上的分销网络的系统,是以商业流程优化为基础,它的核心是销售和库存总和控制.这个分销系统或者说是分销体系,它的使用者包括一个大型企业的内部.各个分公司.各级分销商等,它的作用就在于即时的掌握各地的销售信息流.财务资金流.库存信息等一些功能. 产生背景是什么 知道了Drp是什么,我们还需要了解下它的开发背景是什么,为什么要开发这样的一个系统呢. 这个原因还是

JAVA Drp项目实战—— Unable to compile class for JSP 一波三折

交代下背景,电脑系统是64位的,用的是64位的Tomcat,安装是32位的Myeclipse10,java环境也是32位的,Tomcat在开始启动时会报这样一个错误,"Can't load IA 64-bit .dll on a AMD32-bit platform",但是不耽误使用,最近在敲Drp项目中用到了底层接口的几个方法,这个错误导致项目不能正常运行了,所以就将64位的Tomcat换成了与java环境一样的32位的Tomcat,上面的问题就顺利解决了,于是继续自己的开发,但是当

【java】itoo项目实战之常被忽视的性能优化

Itoo V3.0很快就要结束了,功能上基本上开发完成了,但是放到jboss中部署的时候,使用时感觉特别的慢,如果是数据量多的话,就把慢这个词发挥到了极致.这个慢的问题有大部分是因为基础系统中使用了JPA级联导致的,每次查询的时候,只要有关联的表,都会全部查询出来,一下发出一大版的HQL 语句,看着也是挺吓人的.出来优化JPA级联问题,还可以从代码中下手,从以下的几个方面考虑. (1)减少对象生命周期 对象的生命周期有这么一个计算公式:对象生命周期=销毁时间-创建时间 实际上减少对象生命周期有2

【java】itoo项目实战之java Web 中web的作用

在ITOO中,每个war包下的web.xml都是一样的.它的结构如下: itoo中含有多个war包,而且每个war包中web.xml都和上图的结构一样,而且配置内容都是一样的. 在Javaweb 应用中可以包含HTML 文档,Servlet,JSP和相关java类等,为了Servlet容器能够顺利地找到javaWeb 应用中的各个组件,Servlet规范规定,javaWeb应用必须采取固定的目录结构,即每种类型的组件在Web应用中都有固定的存放目录.Servlet规范还规定,javaWeb应用的

【java】itoo项目实战之百万数据查询优化收集与实践

1.对查询进行优化,应考虑在where 及 order by 涉及的列上建立索引. 2.应尽量避免在where 子句中对字段进行 null值判断,如:        select id from t wherenum is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select idfrom t where num=0 3.应尽量避免在where 子句中使用!=或<>操作符. 4.应尽量避免在where 子句中使用 or 来连接条件,如: selec

【java】itoo项目实战之hibernate 批量保存优化

在itoo中.基本上每一个系统都有一个导入功能,大量的数据填写进入excel模板中.然后使用导入功能导入的数据库中,这样能够大大的提高工作效率. 那么导入就涉及到了批量保存数据库的问题了. 那么通常情况下,在一个Session对象的缓存中数量有限的持久化对象,等到Session对象处理事务完成,还要关闭Session对象,从而及时释放session的缓存占用的内存.在批量保存1万条数据,假设一次性把须要保存的1万条数据载入到内存职工,当运行事务提交的时候,就会清理缓存,hibernate运行1万

【java】itoo项目实战之hibernate 懒加载优化性能

在做itoo 3.0 的时候,考评系统想要上线,就开始导入数据了,只导入学生2万条数据,但是导入的速度特别的慢,这个慢的原因是因为导入的时候进行了过多的IO操作.但是导入成功之后,查询学生的速度更加慢,因为底层用了hibernate的hql语句进行查询的,学习过hibernate的人都知道,如果hibernate不设置懒加载的话,只有是有关联的数据都会一次性全部都查询出来,我试了试,查询2万条数据,最深的级联查询是有5层,然后发出来的语句是460条,时间大概是10s.然后就考虑使用lazy进行优