刚完成的一个项目里有一个导入的功能,用户通过Excel表的形式,将数据存到数据库中。之前也没考虑过很多数据的情况,所以未对导入这块做任何优化。测试之后暴露出2个bug。

  Bug1、导入文件大于2M后直接报错。  这个问题是struts引起的,在struts的配置中有一个配置属性struts.multipart.maxSize,它默认是2000000字节,我们只需将这个值重新赋值为一个更大的值即可,此设为10M

<constant name="struts.multipart.maxSize" value="10000000" />

  Bug2、导入速度很慢,而且机器很卡。

  这个问题是hibernate引起的,这需要提下hibernate的缓存机制,其中包括一级缓存和二级缓存。机器越来越卡的罪魁祸首就是一级缓存,一级缓存会将每个你生成的数据对象保存到内存里。结果就是最后会造成内存溢出。按照这个思路我们就需要定期清理缓存。session.flush();session.clear();慢是因为上传过程中每一个数据对象都重新连接数据库一次所以很慢,所以我们可以选择hibernate的批量上传来解决这个问题。在hibernate的配置文件中也可以在spring的配置文件中直接加上:

<prop key="hibernate.jdbc.batch_size">20</prop><!--size可以视情况而定-->
<prop key="hibernate.cache.use_second_level_cache">false</prop><!--关闭二级缓存-->

然后java代码中:if(i % 20 ==0){

          ......

          session.flush();

          session.clear();

        }

  另一种思路就是不用hibernate直接用JDBC插入数据,这样就不存在内存溢出的问题了,而且通过jdbc方法导入的效率远高于hibernate策略。所以这也是我的最终解决方案。

同时,根据前人测试得出是用jdbc方案没必要在使用batch,使用batch速度反而会慢。

     Session session = getHibernateTemplate().getSessionFactory().openSession();
        Transaction tx=session.beginTransaction(); //使用Hibernate事务处理
        Connection conn=session.connection();
        conn.setAutoCommit(false);
        PreparedStatement stmt=conn.prepareStatement("insert into voucher_order(bankNo,bankName,voucherName,voucherNo,voucherCount,totalPrice)                     values(?,?,?,?,?,?)");
        for(int i=2;i<=sheetData.getLastRowNum();i++){
            setVoucherOrder(stmt,sheetData.getRow(i),noNameMap,voucherMap);
        }
        tx.commit();

参考文档:

http://home.51.com/wangliu007/diary/item/10053146.html

http://superjavason.iteye.com/blog/255423

http://blog.chinaunix.net/uid-25434387-id-1760827.html

  

  

转载于:https://www.cnblogs.com/benjia/p/export_optimize.html

关于批量导入数据以及调优的一些总结相关推荐

  1. 大数据技术之_19_Spark学习_07_Spark 性能调优 + 数据倾斜调优 + 运行资源调优 + 程序开发调优 + Shuffle 调优 + GC 调优 + Spark 企业应用案例

    大数据技术之_19_Spark学习_07 第1章 Spark 性能优化 1.1 调优基本原则 1.1.1 基本概念和原则 1.1.2 性能监控方式 1.1.3 调优要点 1.2 数据倾斜优化 1.2. ...

  2. 怎么接收layui上传的文件_layui 上传文件_批量导入数据UI的方法

    使用layui的文件上传组件,可以方便的弹出文件上传界面. 效果如下: 点击[批量导入]按钮调用js脚本importData(config)就可以实现数据上传到服务器. 脚本: /*** * 批量导入 ...

  3. tp5大数据批量导入mysql_TP5框架下MySQL通过LOAD DATA INFILE批量导入数据详细操作

    LOAD DATA INFILE 语句用法 参考手册 本文语句参数使用默认值 PHP: TP框架环境// 定义文件路径 $file_path = 'LOAD_DATA_LOCAL_INFILE.txt ...

  4. neo4j批量导入数据的两种解决方案

    neo4j批量导入数据的两种解决方案 参考文章: (1)neo4j批量导入数据的两种解决方案 (2)https://www.cnblogs.com/YoungF/p/11632488.html 备忘一 ...

  5. tp5 excel 导入 mysql_TP5框架下MySQL通过LOAD DATA INFILE批量导入数据详细操作

    LOAD DATA INFILE 语句用法 参考手册 本文语句参数使用默认值 PHP: TP框架环境// 定义文件路径 $file_path = 'LOAD_DATA_LOCAL_INFILE.txt ...

  6. 使用python向Redis批量导入数据

    1.使用pipeline进行批量导入数据.包含先使用rpush插入数据,然后使用expire改动过期时间 class Redis_Handler(Handler):def connect(self): ...

  7. 批量导入数据到mssql数据库的

    概述 批量导入数据到数据库中,我们有好几种方式. 从一个数据表里生成数据脚本,到另一个数据库里执行脚本 从EXCEL里导入数据 上面两种方式,导入的数据都会生成大量的日志.如果批量导入5W条数据到数据 ...

  8. 随笔编号-09 批量导入数据(Mysql)报MySQL server has gone away 问题的解决方法

    问题场景: 使用*.sql 脚本,批量导入数据到mysql实例中,使用DOS 界面导入的,期间,到最后一步 source D:\aaa.sql  回车后,系统提示 MySQL server has g ...

  9. shp2sde命令行方式向arcsde批量导入数据脚本的生成步骤

    shp2sde命令行方式向arcsde批量导入数据脚本的生成步骤  作者:半块点心  出处:GIS动力站原 1.在dos提示符下执行: FOR /F "eol=; tokens=1,2,3, ...

最新文章

  1. 【Android工具】安卓魔力播放器moliplayer绿色无广告,手机DLNA播放器
  2. 修复mysql的view_MYSQL数据损坏修复方法
  3. android获得textview数值,android-如何获取textview中的文本语言?
  4. spring如何下载源码和jar包
  5. ArcGIS水文分析实战教程(6)河流提取与河网分级
  6. HTML5网页语音识别功能演示
  7. 浏览器输入URL后,到网页显示,其间发生了什么?
  8. 3dsmax动画六、骨骼调整及蒙皮。
  9. 1×pbs缓冲液配方_PBS缓冲液的配方
  10. 输出方波c语言程序,产生锯齿波以及方波的C程序
  11. Android 第三方 ROM
  12. 汽车牌照 (license) C++
  13. 工作中jQuery常用实例-主要功能总结整理
  14. Android-PickerView系列之封装篇(三)
  15. 第39天:WEB攻防-通用漏洞CSRFSSRF协议玩法内网探针漏洞利用
  16. 蒸妙集团把中药熏蒸以现代科技结合中医古法用于疏通身体的“堵”
  17. 50道简单家常菜~~~~~让你得意厨房
  18. 第三个python小功能完成后记录——二、必要模块函数记忆
  19. Nuist ACM集训队寒假训练计划
  20. 直播|美国莱斯大学胡侠——基于信息瓶颈的深度学习可解释性算法和应用

热门文章

  1. c++窗口管理系统是什么_维维华东食品饮料公司电能管理系统的设计与应用——安科瑞 戴玥...
  2. linux的RPM支持图片格式,Linux下rpm、yum和源码三种安装方式详细介绍
  3. Ubuntu安装jupyter,启动出现ModuleNotFoundError: No module named ‘pysqlite2‘ 错误
  4. sql选择_SQL选择成
  5. gradle构建_如何提高Gradle的构建速度?
  6. jQuery first()和last()函数示例
  7. scala解析xml_Scala XML处理–文字,序列化,解析,保存和加载示例
  8. memcached 命令_Memcached Telnet命令示例
  9. 自动化,Win32API、UIA和MSAA
  10. [nsis]安装包反编译