海量数据插入数据库的快速方案
在我们开发项目过程中,一般都会遇到大批量的数据导入。比如根据订购日志来生成订购记录。经过查询资料发现了2种比较快速的方法:
方法一 需要对日志文件做解析出来的。
public class JDBCMoreQuick {
private static String JDBC_URL = "jdbc:mysql://127.0.0.1:3306/test";
private static String JDBC_USER = "root";
private static String JDBC_PASS = "root";
private static int COUNT = 10000000;
private static int BATCH_SIZE = 1000;
private static int COMMIT_SIZE = 50000;
private static String DATA = "test";
public static void main(String[] args) throws ClassNotFoundException,
SQLException {
long start = System.currentTimeMillis();
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(JDBC_URL
+ "?rewriteBatchedStatements=true", JDBC_USER, JDBC_PASS);
conn.setAutoCommit(false);
PreparedStatement pstmt = conn
.prepareStatement("insert into test (id, name) values (?, ?)");
for (int i = 1; i <= COUNT; i++) {
pstmt.setInt(1, i);
pstmt.setString(2, DATA);
pstmt.addBatch();
if(i%BATCH_SIZE==0){
pstmt.executeBatch();
System.out.println(i);
}
}
pstmt.executeBatch();
conn.commit();
pstmt.close();
conn.close();
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
这种方法插入100W条数据10秒不到。
注意:sql语句中的 values 后面必须要有一个空格 否则参数rewriteBatchedStatements = true将不会有作用。
还有一点就是参数useServerPreStmts这个参数可以不用添加,如果添加了其值为true的话,那么当BATCH_SIZE过大时则会抛出异常!
方法二 直接对日志文件操作的不用解析的
public class JDBCFileLoad {
private static String JDBC_URL = "jdbc:mysql://127.0.0.1:3306/databaseName";
private static String JDBC_USER = "root";
private static String JDBC_PASS = "root";
private static int COUNT = 10000000;
private static int BATCH_SIZE = 1000;
private static int COMMIT_SIZE = 1000000;
private static String DATA = "test";
private static String fileName = "D:\\temp\\Orderlog_20160117.log";
public static void main(String[] args) throws ClassNotFoundException,
SQLException, FileNotFoundException {
long start = System.currentTimeMillis();
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(JDBC_URL
+ "?rewriteBatchedStatements=true", JDBC_USER, JDBC_PASS);
conn.setAutoCommit(false);
PreparedStatement pstmt = conn.prepareStatement("load data local infile '' "
+ "into table order_record fields "
+ " terminated by '|' "
+"(user_id,purchase_time,valid_time,expired_time,product_type,product_name,product_code,"
+ "price,service,pay_type,order_valid,unsubscribe_time)"
);
InputStream is = new FileInputStream(fileName);
((com.mysql.jdbc.Statement) pstmt)
.setLocalInfileInputStream(is);
pstmt.execute();
conn.commit();
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
这种方法和方法一的效果差不多。
注意:数据库连接驱动的版本尽可能的要高些,
因为低版本不支持方法setLocalInfileInputStream()。
如果是用到框架的话,可以先从容器中获取一个session然后去 手动控制连接是否自动提交,这样的话对于大数据的插入就会轻松很多,希望这对您会有所帮助,如果您有更好的方法,请多多指教!
海量数据插入数据库的快速方案相关推荐
- python导入csv数据例子-使用python读取csv文件快速插入数据库的实例
如下所示: # -*- coding:utf-8 -*- # auth:ckf # date:20170703 import pandas as pd import cStringIO import ...
- 数十万条以上的大量数据如何快速插入数据库中
引言:这几天工作这边同事遇到了一个问题,对十五万条数据进行计算,插入数据库的时候耗时很严重,使用了批量插入对十五万条数据插入仍然耗费了30秒,前面计算也耗费了二十多秒,系统流畅度因此很难堪.经过我的排 ...
- 简单好用!利用Spring AOP技术10分钟实现一个数据库读写分离方案
前言 最近我们的APP在线用户越来越多,接口的响应速度也是越来越慢,经过运维排查发现是由于并发查询太多导致的数据库压力比较大,架构师经过调研给出了数据库读写分离的解决方案,为了快速解决问题,我们最终采 ...
- Discuz!NT数据库读写分离方案
目前在Discuz!NT这个产品中,数据库作为数据持久化工具,必定在并发访问频繁且负载压力较大的情况下成 为系统性能的'瓶颈'.即使使用本地缓存等方式来解决频繁访问数据库的问题,但仍旧会有大量的并发请 ...
- mysql 分区表_分享一份生产环境mysql数据库分区表改造方案
概述 简单分享下最近做的一个mysql数据库分区表改造方案,仅供参考. 思路:(假设在2020.7.21进行表分区改造) 没时间,就不画图说明了 1.创建与原始表一样结构的新表,新分区 2.往新表插入 ...
- mysql数据库搜索字符_在MySQL数据库中快速搜索字符串?
使用FULLTEXT搜索来快速搜索字符串.让我们首先创建一个表-mysql> create table DemoTable1554 -> ( -> Title text -> ...
- 在进行数据插入数据库操作时,对于id的处理
例如:在进行用户注册时,要将用户的注册信息插入数据库,对于id我们该如何处理呢? 解决办法: 1.针对MySQL等可以设置自动增长的数据库 在数据库中,设置id自动增长!!!!不要忘记啊!!在插入时就 ...
- 并发插入数据库会导致失败吗_会导致业务失败的数据分析方法
并发插入数据库会导致失败吗 The true value of data depends on business insight.Data analysis is one of the most po ...
- 如何应对Spark-Redis行海量数据插入、查询作业时碰到的问题
摘要:由于redis是基于内存的数据库,稳定性并不是很高,尤其是standalone模式下的redis.于是工作中在使用Spark-Redis时也会碰到很多问题,尤其是执行海量数据插入与查询的场景中. ...
- 转:Mybatis与JDBC批量插入数据库哪个更快
转自 http://www.cnblogs.com/fnz0/p/5713102.html, https://www.cnblogs.com/wxw7blog/p/8706797.html [转]: ...
最新文章
- [Node.js]常用工具
- Xamarin iOS开发实战上册-----2.2.2 使用代码添加视图
- SAP CRM WebClient UI CL_BSP_MESSAGES
- TensorFlow入门:TensorFlow工作原理
- 论软件工程师的自我修养:角色、重构与质量
- 用quartus搭建soc-串口发送学号完整流程(软件+硬件)
- 学习笔记01:《开放平台产品成长之路-POP》
- SSH密钥 - 仍然要求输入密码和密码
- 大数据应用需要注意什么问题
- python-递归函数
- Win10x64安装Dolby
- Flex 桌面应用 adl 调试模式运行
- vs2013怎么清理解决方案_vs2010/2013项目所在文件夹越来越大如何解决?
- 【译】volatile C语言关键字,如何使用?
- 【Tensorflow】 tf.equal(tf.argmax(y, 1),tf.argmax(y_, 1))用法
- win7 wlan 服务器无响应,Win7启用WLAN AutoConfig服务错误1068的解决措施
- PCM data flow - part 4: ASoC platform driver
- 读《道德经》:混职场的你别不服,牛人与普通人,就差这5点!
- java工程师个人学习计划
- 使用 node + express + socket 来一个即时聊天~
热门文章
- 商务英语还是计算机专业好,是读广东外语外贸大学计算机专业好还是广东工业大学计算机专业好...
- java程序dna,蓝桥杯——DNA(Java题解)
- 【问题8】Redis它到底解决了哪些问题?
- Ansible-Tower自动化运维管理环境部署记录
- 剑指offer :跳台阶
- 走进javascript——DOM事件
- cf701B Cells Not Under Attack
- GPUGraphicsGame tools
- [导入]Manning.Ajax.in.Action.Oct.2005.pdf(9.26 MB)
- 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。