Java 使用 JDBC 向 MySQL 数据库批次插入 10W 条数据 (测试效率)
这里有新鲜出炉的 Java 并发编程示例, 程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
使用 JDBC 连接 MySQL 数据库进行数据插入的时候, 特别是大批量数据连续插入(100000), 如何提高效率呢? 今天小编通过本教程给大家介绍下
使用 JDBC 连接 MySQL 数据库进行数据插入的时候, 特别是大批量数据连续插入(100000), 如何提高效率呢?
在 JDBC 编程接口中 Statement 有两个方法特别值得注意:
通过使用 addBatch()和 executeBatch()这一对方法可以实现批量处理数据
不过值得注意的是, 首先需要在数据库链接中设置手动提交,
connection.setAutoCommit(false)
, 然后在执行 Statement 之后执行 connection.commit()
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.SQLException;
- import java.util.Date;
- import com.mysql.jdbc.Connection;
- public class MysqlBatchUtil {
- private String sql = "INSERT INTO db_test (param1,param2,param3,param4,param5) VALUES (?,?,?,?,?)";
- private String charset = "utf-8";
- private String connectStr = "jdbc:mysql://localhost:3306/test";
- private String username = "root";
- private String password = "123456";
- private void doStore() throws ClassNotFoundException,
- SQLException,
- IOException {
- Class.forName("com.mysql.jdbc.Driver");
- connectStr += "?useServerPrepStmts=false&rewriteBatchedStatements=true"; // 此处是测试高效批次插入, 去掉之后执行时普通批次插入
- Connection conn = (Connection) DriverManager.getConnection(connectStr, username, password);
- conn.setAutoCommit(false); // 设置手动提交
- int count = 0;
- PreparedStatement psts = conn.prepareStatement(sql);
- String line = null;
- Date begin = new Date();
- for (int i = 0; i <= 100000; i++) {
- psts.setString(1, i + "param1");
- psts.setString(2, i + "param2");
- psts.setString(3, i + "param3");
- psts.setString(4, i + "param4");
- psts.setString(5, i + "param5");
- psts.addBatch(); // 加入批量处理
- count++;
- }
- psts.executeBatch(); // 执行批量处理
- conn.commit(); // 提交
- Date end = new Date();
- System.out.println("数量 =" + count);
- System.out.println("运行时间 =" + (end.getTime() - begin.getTime()));
- conn.close();
- }
- public static void main(String[] args) {
- try {
- new MysqlBatchUtil().doStore();
- } catch(ClassNotFoundException e) {
- e.printStackTrace();
- } catch(SQLException e) {
- e.printStackTrace();
- } catch(IOException e) {
- e.printStackTrace();
- }
- }
- }
测试结果:
数量 = 100001
运行时间 = 4725
一共 10W, 执行时间一共花费 47 秒.
这个效率仍然不高, 似乎没有达到想要的效果, 需要进一步改进
在 MySQL JDBC 连接字符串中还可以加入参数,
rewriteBatchedStatements = true
mysql 默认关闭了 batch 处理, 通过此参数进行打开, 这个参数可以重写向数据库提交的 SQL 语句
useServerPrepStmts = false
如果不开启(useServerPrepStmts=false), 使用 com.mysql.jdbc.PreparedStatement 进行本地 SQL 拼装, 最后送到 db 上就是已经替换了? 后的最终 SQL.
在此稍加改进, 连接字符串中加入下面语句(代码构造方法中去掉注释):
connectStr += "?useServerPrepStmts=false&rewriteBatchedStatements=true";
再次测试结果如下:
数量 = 100001
运行时间 = 1213
同样的数据量, 这次执行只花费了 12 秒 , 由此可见处理效率大大提高, 呵呵
以上所述是小编给大家介绍的 Java 使用 JDBC 向 MySQL 数据库批次插入 10W 条数据测试效率, 希望对大家有所帮助
来源: http://www.phperz.com/article/18/0208/359031.html