对大数据的批量导入MySQL数据库
程序员文章站
2023-11-09 17:30:04
自己的库里有索引在用insert导入数据时会变慢很多 使用事务+批量导入 可以配置使用spring+mybatis整合的方式关闭自动提交事务(地址),选择批量导入每一百条导入使用list存储值传入到mybatis中 http://x125858805.iteye.com/blog/2369243 或 ......
自己的库里有索引在用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进行按行读取并进行判断重写写入临时文件
这就又有个问题,读取写入需要花费太多时间,因为自己需要各种业务逻辑进行处理。目前正在努力解决中,如果大家有什么好的方法可以提出来一下!
上一篇: linux scp命令 将数据从一台linux服务器复制到另一台linux服务器
下一篇: 守护进程