使用JDBC在MySQL数据库中快速批量插入数据
时间:2021-07-01 10:21:17
帮助过:41人阅读
print?
- package cyl.demo.ipsearcher;
-
- import java.io.BufferedReader;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.SQLException;
-
- public class DbStoreHelper {
-
- private String insert_sql;
- private String charset;
- private boolean debug;
-
- private String connectStr;
- private String username;
- private String password;
-
- public DbStoreHelper() {
- connectStr = "jdbc:mysql://localhost:3306/db_ip";
-
- insert_sql = "INSERT INTO tb_ipinfos (iplong1,iplong2,ipstr1,ipstr2,ipdesc) VALUES (?,?,?,?,?)";
- charset = "gbk";
- debug = true;
- username = "root";
- password = "***";
- }
-
- public void storeToDb(String srcFile) throws IOException {
- BufferedReader bfr = new BufferedReader(new InputStreamReader(new FileInputStream(srcFile), charset));
- try {
- doStore(bfr);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- bfr.close();
- }
- }
-
- private void doStore(BufferedReader bfr) throws ClassNotFoundException, SQLException, IOException {
- Class.forName("com.mysql.jdbc.Driver");
- Connection conn = DriverManager.getConnection(connectStr, username,password);
- conn.setAutoCommit(false);
- int count = 0;
- PreparedStatement psts = conn.prepareStatement(insert_sql);
- String line = null;
- while (null != (line = bfr.readLine())) {
- String[] infos = line.split(";");
- if (infos.length < 5) continue;
- if (debug) {
- System.out.println(line);
- }
- psts.setLong(1, Long.valueOf(infos[0]));
- psts.setLong(2, Long.valueOf(infos[1]));
- psts.setString(3, infos[2]);
- psts.setString(4, infos[3]);
- psts.setString(5, infos[4]);
- psts.addBatch();
- count++;
- }
- psts.executeBatch();
- conn.commit();
- System.out.println("All down : " + count);
- conn.close();
- }
-
- }
执行完成以后:
[plain] view plain
copy
print?
- All down : 103498
- Convert finished.
- All spend time/s : 47
一共10W+,执行时间一共花费 47 秒.
这个效率仍然不高,似乎没有达到想要的效果,需要进一步改进。
在MySQL JDBC连接字符串中还可以加入参数,
rewriteBatchedStatements=true,mysql默认关闭了batch处理,通过此参数进行打开,这个参数可以重写向数据库提交的SQL语句,具体参见:http://www.cnblogs.com/chenjianjx/archive/2012/08/14/2637914.html
useServerPrepStmts=false,如果不开启(useServerPrepStmts=false),使用com.mysql.jdbc.PreparedStatement进行本地SQL拼装,最后送到db上就是已经替换了?后的最终SQL.
在此稍加改进,连接字符串中加入下面语句(代码构造方法中去掉注释):
connectStr += "?useServerPrepStmts=false&rewriteBatchedStatements=true";
再次执行如下:
[plain] view plain
copy
print?
- All down : 103498
- Convert finished.
- All spend time/s : 10
同样的数据量,这次执行只花费了10秒 ,处理效率大大提高.
使用JDBC在MySQL数据库中快速批量插入数据
标签:final res ase about bar readline log number 编程