网站首页 > 精选教程 正文
导论
笔者的毕业设计是一个与大数据相关的项目,其中遇到了一个将百万级别数据存储到MySQL 的问题,本来是打算使用Spark SQL 的DataFrame 自带的API来直接将数据存储到MySQL 中,可是当我看到MySQL 监控平台的数据,我瞬间被打了脸,没那么简单,在监控平台上面显示着平均每5 秒插入140条左右的数据,笔者瞬间被吓到了,心想,这可不行,按这个速度,那要运行到何年何月,然后笔者自行Google 了一下,决定使用JDBC 批处理。
Java 高性能批处理
MySQL 之rewriteBatchedStatements
这是MySQL 批处理的一个重要参数,默认为false
当rewriteBatchedStatements 为false 时
执行插入的SQL 语句是
insert into ***_table values (***)
当rewriteBatchedStatements 为true 时
insert语句,满成条件情况下,会整合成形如:
insert into xxx_table values (aa),(bb),(cc).
然后分批次发送给MySQL(会有一次发送的package大小限制,所以需要拆分批次)
示例代码(这里使用的是Scala,其实调用的都是Java 的库)
- 设置rewriteBatchedStatements 为true
val mysqlConfProd = collection.mutable.Map(
"driver" -> "com.mysql.jdbc.Driver",
"url" -> "jdbc:mysql://******.com:3306/behavior_db?rewriteBatchedStatements=true",
"username" -> "root",
"password" -> "root"
)
- 执行批处理程序
var index = 0val begin = System.currentTimeMillis()for (item <- items) { index = index + 1
// 每次批处理插入10000 条数据 if (index >= 10000) { println("执行批处理任务,插入一万条数据")
preparedStatement.executeBatch()
mysql.commit()
println("插入成功")
index = 1
}
preparedStatement.setString(1, item.getString(0))
preparedStatement.setString(2, item.getString(1))
preparedStatement.setLong(3, item.getLong(2))
preparedStatement.setString(4, item.getString(3))
preparedStatement.addBatch()}
// 执行批处理,完成剩下的任务
preparedStatement.executeBatch()
mysql.commit()
val end = System.currentTimeMillis()
println(end - begin)
测试结果,插入三百万条数据,耗时68.047 秒
耗时还是十分可观的,可见JDBC 的批处理功能还是十分强大的!
猜你喜欢
- 2024-10-29 Java中最简单的连接Oracle数据库和Mysql数据库的方式
- 2024-10-29 Java | MySQL 分布函数、前后函数你认识吗?
- 2024-10-29 Javaweb知识 day02 mysql数据库 javaweb程序设计任务教程黑马程序员电子版
- 2024-10-29 Jenkins Pipeline 连接 MySQL 数据库
- 2024-10-29 银四将近,Java程序员临时抱佛脚也要啃下的硬骨头——MySQL
- 2024-10-29 Java代码中,如何监控Mysql的binlog?
- 2024-10-29 Java环境+Mysql+Tomcat部署JavaWeb项目到云服务器(十分详细)
- 2024-10-29 mysql-connector-java与MySQL 8.X版本建立连接
- 2024-10-29 java连接mysql数据库达成数据查询详细教程
- 2024-10-29 Java代码操作MySQL java操作mysql语法
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)