一.导入功能优化

普通for循环,对于导入大量数据时非常耗时。可以通过Mybatis的批量插入功能提高效率。
每批次导入的数据不能太多,否则会报错。通过测试发现,每批次200条为宜。

测试结果:
开启事务情况下:

            文件大小(k)    时长(ms)    测试次数    数据量(条数)
batchInsert:    292        400          5        3000
             240        230          3        2000
             187        110          3        1000
             104        70           5        500
             292        8700         5        3000
for:            240        5800         3        2000
                187        3200         3        1000
                104        1500         2        500
        

1.Service

@Override
    @Transactional
    public String importListTest(InputStream in, String fileName) {
        int num = 0;

        String[][] table = null;
        String msg = null;
        try {
            table = ExcelUtils.readExcel(in,fileName,0);
        } catch (Exception e) {
            e.printStackTrace();
            return "文件导入失败,请检查文件格式!";
        }
        Map<String,Integer> tableColumMap = new HashMap<String, Integer>();
        if (CheckUtils.isNullOrBlank(table)
                || table.length == 0) {
            return "表格中没有任何数据!";
        }
        if (table.length == 1) {
            return "表格中只存在表头数据!";
        }
        //校验导入文件内容
        for (int i = 0; i < table[0].length; i++) {
            String cell = table[0][i].trim();
            tableColumMap.put(cell, i);
        }

        List<String> errorMsgs = new ArrayList<String>();
        String[] titles ={"源声ID","源声描述","产品名称","产品内部型号","产品外部型号","ROM版本","系统版本","创建时间","IMEI","SN","问卷次数","满意度得分(问题1)","推荐值得分(问题2)"};
        for (int i = 0; i < titles.length; i++) {
            String title = titles[i];
            if(!tableColumMap.containsKey(title)){
                errorMsgs.add("Excel表格表头列有误,不存在"+title+"列,请修改Excel后导入");
                if(errorMsgs.size() >= 10) return "导入文件表头不正确,请检查后重新导入!";
            }
        }

        long start = System.currentTimeMillis();
        if (errorMsgs.size() == 0) {

            NPSSourceAnalysis npsSourceAnalysis=new NPSSourceAnalysis();

            for (int i = 1; i < table.length; i++) {
                String sourceID = table[i][tableColumMap.get("源声ID")].trim();
                String descript = table[i][tableColumMap.get("源声描述")].trim();

                if(descript.length()>1000){
                     descript = (String) descript.subSequence(0, 999);
                }
                String product = table[i][tableColumMap.get("产品名称")].trim();
                String inner = table[i][tableColumMap.get("产品内部型号")].trim();
                String outer = table[i][tableColumMap.get("产品外部型号")].trim();
                String ROM = table[i][tableColumMap.get("ROM版本")].trim();
                String createTime = table[i][tableColumMap.get("创建时间")].trim();
                String SN = table[i][tableColumMap.get("SN")].trim();
                String CSR = table[i][tableColumMap.get("满意度得分(问题1)")].trim();
                String recommend = table[i][tableColumMap.get("推荐值得分(问题2)")].trim();

                npsSourceAnalysis.setSourceID(Integer.parseInt(sourceID));
                npsSourceAnalysis.setDescript(descript);
                npsSourceAnalysis.setProduct(product);
                npsSourceAnalysis.setInnerVersion(inner);
                npsSourceAnalysis.setOuterVersion(outer);
                npsSourceAnalysis.setROM(ROM);
                npsSourceAnalysis.setCreateTime(createTime);
                npsSourceAnalysis.setSN(SN);
                npsSourceAnalysis.setCSR(Integer.parseInt(CSR));
                npsSourceAnalysis.setRecommend(Integer.parseInt(recommend));
                nPSSourceAnalysisMapper.insertTest(npsSourceAnalysis);    

            }
            msg = "success-import:-"+num+"-items";
        } else{
            for (String errorMsg : errorMsgs) {
                msg = msg + errorMsg +";";
            }
        }

        /*if (errorMsgs.size() == 0) {

            int total = table.length/200 + 1;
            for (int j = 0; j < total-1; j++) {

                List<NPSSourceAnalysis> list = new ArrayList<NPSSourceAnalysis>();

                for (int i = 1+200*j; i < 1+200+200*j; i++) {
                    NPSSourceAnalysis npsSourceAnalysis=new NPSSourceAnalysis();
                    String sourceID = table[i][tableColumMap.get("源声ID")].trim();
                    String descript = table[i][tableColumMap.get("源声描述")].trim();

                    if(descript.length()>1000){
                         descript = (String) descript.subSequence(0, 999);
                    }
                    String product = table[i][tableColumMap.get("产品名称")].trim();
                    String inner = table[i][tableColumMap.get("产品内部型号")].trim();
                    String outer = table[i][tableColumMap.get("产品外部型号")].trim();
                    String ROM = table[i][tableColumMap.get("ROM版本")].trim();
                    String createTime = table[i][tableColumMap.get("创建时间")].trim();
                    String SN = table[i][tableColumMap.get("SN")].trim();
                    String CSR = table[i][tableColumMap.get("满意度得分(问题1)")].trim();
                    String recommend = table[i][tableColumMap.get("推荐值得分(问题2)")].trim();
                    npsSourceAnalysis.setSourceID(Integer.parseInt(sourceID));
                    npsSourceAnalysis.setDescript(descript);
                    npsSourceAnalysis.setProduct(product);
                    npsSourceAnalysis.setInnerVersion(inner);
                    npsSourceAnalysis.setOuterVersion(outer);
                    npsSourceAnalysis.setROM(ROM);
                    npsSourceAnalysis.setCreateTime(createTime);
                    npsSourceAnalysis.setSN(SN);
                    npsSourceAnalysis.setCSR(Integer.parseInt(CSR));
                    npsSourceAnalysis.setRecommend(Integer.parseInt(recommend));
                    list.add(npsSourceAnalysis);
                }
                nPSSourceAnalysisMapper.batchInsert(list);
            }

            //最后不够200条
            List<NPSSourceAnalysis> list = new ArrayList<NPSSourceAnalysis>();

            for (int i = 1+200*(total-1); i < table.length; i++) {
                NPSSourceAnalysis npsSourceAnalysis=new NPSSourceAnalysis();
                String sourceID = table[i][tableColumMap.get("源声ID")].trim();
                String descript = table[i][tableColumMap.get("源声描述")].trim();

                if(descript.length()>1000){
                     descript = (String) descript.subSequence(0, 999);
                }
                String product = table[i][tableColumMap.get("产品名称")].trim();
                String inner = table[i][tableColumMap.get("产品内部型号")].trim();
                String outer = table[i][tableColumMap.get("产品外部型号")].trim();
                String ROM = table[i][tableColumMap.get("ROM版本")].trim();
                String createTime = table[i][tableColumMap.get("创建时间")].trim();
                String SN = table[i][tableColumMap.get("SN")].trim();
                String CSR = table[i][tableColumMap.get("满意度得分(问题1)")].trim();
                String recommend = table[i][tableColumMap.get("推荐值得分(问题2)")].trim();
                npsSourceAnalysis.setSourceID(Integer.parseInt(sourceID));
                npsSourceAnalysis.setDescript(descript);
                npsSourceAnalysis.setProduct(product);
                npsSourceAnalysis.setInnerVersion(inner);
                npsSourceAnalysis.setOuterVersion(outer);
                npsSourceAnalysis.setROM(ROM);
                npsSourceAnalysis.setCreateTime(createTime);
                npsSourceAnalysis.setSN(SN);
                npsSourceAnalysis.setCSR(Integer.parseInt(CSR));
                npsSourceAnalysis.setRecommend(Integer.parseInt(recommend));
                list.add(npsSourceAnalysis);
            }
            nPSSourceAnalysisMapper.batchInsert(list);            

            msg = "success-import:-"+num+"-items";
        } else{
            for (String errorMsg : errorMsgs) {
                msg = msg + errorMsg +";";
            }
        }*/

        long end = System.currentTimeMillis();
        logger.info("时长:"+(end-start));

            return msg;
     }

dao:

int batchInsert(List<NPSSourceAnalysis> list);

mapper:

<insert id="batchInsert" >
    insert into nps_source_analysis_test (sourceID, descript, product, innerVersion,outerVersion,ROM, createTime, SN, CSR, recommend)
    values
    <foreach item="item" index="index" collection="list" separator=",">
      (#{item.sourceID,jdbcType=INTEGER}, #{item.descript,jdbcType=NVARCHAR}, #{item.product,jdbcType=NVARCHAR},#{item.innerVersion,jdbcType=NVARCHAR},#{item.outerVersion,jdbcType=NVARCHAR},
       #{item.ROM,jdbcType=NVARCHAR}, #{item.createTime,jdbcType=NVARCHAR}, #{item.SN,jdbcType=NVARCHAR}, #{item.CSR,jdbcType=INTEGER}, #{item.recommend,jdbcType=INTEGER})
    </foreach>
</insert>

mybatis之批量插入的更多相关文章

  1. mybatis foreach批量插入数据:Oracle与MySQL区别

    mybatis foreach批量插入数据:Oracle与MySQL不同点: 主要不同点在于foreach标签内separator属性的设置问题: separator设置为","分 ...

  2. Mybatis+mysql批量插入性能分析测试

    前言 今天在网上看到一篇文章(后文中的文章指的就是它) https://www.jianshu.com/p/cce617be9f9e 发现了一种有关于mybatis批量插入的新方法,而且看了文章发现我 ...

  3. mysql基础---->mybatis的批量插入(一)

    这里面记录一下使用mybatis处理mysql的批量插入的问题,测试有可能不准.只愿世间风景千般万般熙攘过后,字里行间,人我两忘,相对无言. mybatis的批量插入 我们的测试主体类是springb ...

  4. mybatis + mysql 批量插入、删除、更新

    mybatis + mysql 批量插入.删除.更新 Student 表结构 批量插入 public int insertBatchStudent(List<Student> studen ...

  5. mybatis+mysql批量插入和批量更新、存在及更新

    mybatis+mysql批量插入和批量更新 一.批量插入 批量插入数据使用的sql语句是: insert into table (字段一,字段二,字段三) values(xx,xx,xx),(oo, ...

  6. MyBatis原生批量插入的坑与解决方案!

    前面的文章咱们讲了 MyBatis 批量插入的 3 种方法:循环单次插入.MyBatis Plus 批量插入.MyBatis 原生批量插入,详情请点击<MyBatis 批量插入数据的 3 种方法 ...

  7. mybatis中批量插入的两种方式(高效插入)

    MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用 ...

  8. Mybatis 实现批量插入和批量删除源码实例

    Mybatis 实现批量插入数据和批量删除数据 学习内容: 准备工作 1.数据库新建表 2.新建 Maven 项目和设置编译版本及添加依赖 3.新建 db.properties 4.新建 mybati ...

  9. 161102、MyBatis中批量插入

    方法一: <insert id="insertbatch" parameterType="java.util.List"> <selectKe ...

随机推荐

  1. 排序算法之折半插入排序的思想以及Java实现

    1 基本思想 折半插入排序(binary insertion sort)的基本原理与直接插入排序相同,不同之处在于,确定当前记录在前面有序子数组中的位置时,直接插入排序是采用顺序查找的方法,而折半插入 ...

  2. June 1. 2018 Week 22nd Friday

    What makes life dreary is the want of motive. 没有了目的,生活便暗淡无光. We all have dreams about our future, we ...

  3. Java同步(Synchronization)

    前言 线程间的通信主要通过共享对字段的访问和对象引用字段的引用,可能会产生两种错误,线程干扰和内存一致性错误.Java的同步就是防止这些错误,但当多个线程访问同一资源会导致线程执行缓慢,甚至暂停执行. ...

  4. 谱聚类算法(Spectral Clustering)

        谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法--将带权无向图划分为两个或两个以上的最优子图,使子图内部尽量相似,而子图间距离尽量距离较远,以达到常见的聚类的 ...

  5. 大数据计算平台Spark内核全面解读

    1.Spark介绍 Spark是起源于美国加州大学伯克利分校AMPLab的大数据计算平台,在2010年开源,目前是Apache软件基金会的顶级项目.随着Spark在大数据计算领域的暂露头角,越来越多的 ...

  6. nginx 学习笔记

    Nginx是一个自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作 ...

  7. ThreadLocal源码调试——“this”作为key

    前言:在一次面试过程中被问到ThreadLocal,大家都知道ThreadLocal可以为每个线程单独提供一个副本,从而实现变量间的隔离.在ThreadLocal中set和get操作的key是什么,T ...

  8. wait和notify

    ①  wait() 与 notify/notifyAll 方法必须在同步代码块中使用 synchronized修饰的同步代码块或方法里面调用wait() 与 notify/notifyAll()方法 ...

  9. 【转】怎么给javascript + div编辑框光标位置插入表情文字等?

    最近刚好碰到这个问题,虽然离提出问题已经过了半年了,本着前人栽树后人乘凉的精神,还是回答一下.效果: &amp;amp;amp;lt;img src="https://pic2.zh ...

  10. Rsync服务实战

    目录 1 安装rsync软件 2 配置 /etc/rsyncd.conf 3 创建用户(运行rsync服务的用户身份) 4 创建虚拟用户密码文件(客户端连接时候使用) 5启动 rsync 服务,并加入 ...