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

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

相关推荐
高级程序源4 小时前
django校园寻物通失物招领平台32261-计算机课程设计、毕业设计
vue.js·python·mysql·小程序·django·flask·课程设计
nvd114 小时前
Flink 批处理驱动的湖仓 AI 财务研报流水线:从双流广播汇聚到 Agent 智能决策与原生 Iceberg 落盘全景实战
大数据·人工智能·flink
KIDULT°4 小时前
MySQL系列 (1):数据库原理
运维·数据库·mysql·云计算
我不是程序员三三5 小时前
透明加密软件偶发解密异常排错实录:文件时能打开时乱码
数据库·域智盾
snhna5 小时前
向量数据库深度实战:从 HNSW 到 pgvector、Milvus 选型与 RAG 落地
数据库·人工智能·python·postgresql·milvus
天行健,君子而铎5 小时前
数据分类分级的范式转换:从规则匹配到场景化高准确率一键部署
网络·数据库·安全
牛战士coding5 小时前
MySQL 读写分离完整链路:主从复制、多数据源与 @DS 路由
数据库·mysql
计算机编程指导师6 小时前
【计算机毕设推荐】基于Hadoop+Spark的公共交通运营数据分析与可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·计算机·数据分析·spark·交通
goehou6 小时前
MCP 查数实战:让 LLM 安全地查数据库(只读账号、SQL 校验、参数漂移)
数据库·ai·llm·教程·mcp·function calling
我不会插花弄玉7 小时前
7.函数【由浅入深-MySQL】
android·数据库·mysql