zoukankan      html  css  js  c++  java
  • 对大数据的批量导入MySQL数据库

    自己的库里有索引在用insert导入数据时会变慢很多

      使用事务+批量导入

        可以配置使用spring+mybatis整合的方式关闭自动提交事务(地址),选择批量导入每一百条导入使用list存储值传入到mybatis中

          http://x125858805.iteye.com/blog/2369243

              list.add(bill); //自己选择插入对象
                    if(list.size()==1000) {
                        Result<Integer> num = billCheckService.batchInsert(list); //将会调用下面的配置文件
                        countnum+=num.getData();
                        for(int i = 0; i < num.getData();i++) {
                            countmoney+=list.get(i).getPayAmount();
                        }
                        list.clear(); 
                    }
    <insert id="batchInsert" parameterType="java.util.List" >
            insert into t_pay_bill_file_detail (file_id,pay_order_no,third_trade_no)
            values
            <foreach collection="list" item="item" index="index" separator=",">
                (
                #{item.fileId},
                #{item.payOrderNo},
                #{item.thirdTradeNo}
                )
            </foreach>
        </insert>

    或者使用原始的jdbc关闭事务进行批量提交

    conn.setAutoCommit(false); //一句话就可以啦

              ps.addBatch();
                    if(list.size()==1000) {int[] num = ps.executeBatch();
                        conn.commit();
              }

    前两个自己试验的时候大概花的时间都一样,自己又试验了一个按文件处理的语句进行jdbc插入,是最快的方式了,可以在SQL后面制定插入固定字段的值,前提是文件的顺序必须是一样的,注意事项:

    character set utf8 --------这里是utf8不是utf-8;
    fields terminated by ','----文件中每个字段是按‘,’分割的,如.csv文件
    lines terminated by '\n'---每行代表一个记录;
            Class.forName("com.mysql.jdbc.Driver");
                conn = DriverManager.getConnection("jdbc:mysql://192.168.2.18:3306/fi?characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false",
                        username,password);
                reader = new BufferedReader(new InputStreamReader(file.getInputStream())); //因为自己是从前端传进来一个file(MultipartFile类型)
                file1=File.createTempFile("gjy",".txt",new File("E:"));  //E:后面不用写//来代表在盘符下,SQL会默认缺省的,不然添加后报错
           String sql = "load data local infile "+'"'+ file1.getAbsolutePath()+'"' 
                        +" into table t_pay_bill_file_detailcopy character set utf8 fields terminated by ',' "
                        + "lines terminated by '\n' "
                        + "(`file_id`,`trans_type`,`pay_channel_id`,`pay_order_no`,`third_trade_no`,`trans_date`,`pay_amount`) ";
                ps = conn.prepareStatement(sql);
                ps.execute();
           file1.deleteOnExit(); //程序退出时删除临时文件

    这个方式虽然快是快,但是对文件的要求太高,客户不可能对程序理解,只知道传进来文件,所以自己取到file对象都会对file进行按行读取并进行判断重写写入临时文件

    这就又有个问题,读取写入需要花费太多时间,因为自己需要各种业务逻辑进行处理。目前正在努力解决中,如果大家有什么好的方法可以提出来一下!

     ps:关注一下本人公众号,每周都有新更新哦!

     

  • 相关阅读:
    [Effective JavaScript 笔记]第47条:绝不要在Object.prototype中增加可枚举的属性
    [Effective JavaScript 笔记]第46条:使用数组而不要使用字典来存储有序集合
    [Effective JavaScript 笔记]第45条:使用hasOwnProperty方法以避免原型污染
    [Effective JavaScript 笔记]第44条:使用null原型以防止原型污染
    redhat下配置SEED DVS6446开发环境3
    redhat下配置SEED DVS6446开发环境2
    redhat下配置SEED DVS6446开发环境1
    关于[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] 的解释
    SQL2008附加数据库报错
    结构体与类
  • 原文地址:https://www.cnblogs.com/guoxiaoyu/p/9716944.html
Copyright © 2011-2022 走看看