对大数据的批量导入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进行按行读取并进行判断重写写入临时文件

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

相关推荐
鹏说大数据21 分钟前
MySQL连接较慢原因分析及解决措施
数据库·mysql
极限实验室2 小时前
使用 INFINI Gateway 保护 Elasticsearch 集群之修改查询不合理参数(二)
数据库
竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。2 小时前
etcd客户化工具
数据库·etcd
谷晓光2 小时前
python中print函数的flush如何使用
linux·服务器·数据库
OceanBase数据库官方博客2 小时前
自然语言秒转SQL—— 免费体验 OB Cloud Text2SQL 数据查询
数据库·sql·ai·oceanbase·分布式数据库·向量·text2sql
Stark、2 小时前
【MySQL】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法
数据库·后端·sql·mysql
yqcoder3 小时前
Redis 的应用场景
数据库·redis·缓存
kngines3 小时前
【实战ES】实战 Elasticsearch:快速上手与深度实践-8.2.2成本优化与冷热数据分离
大数据·数据库·elasticsearch·搜索引擎
多多*4 小时前
浅谈Mysql数据库事务操作 用mybatis操作mysql事务 再在Springboot中使用Spring事务控制mysql事务回滚
java·数据库·windows·github·mybatis