最近没事比较了下jdbc数据插入大概400万的到mysql数据库,用了两种方式
一种是直接使用原生的jdbc插入数据到数据库,一种是采用调用数据库存储过程的方式插入数据,可能因为个人电脑配置问题,使用存储过程插入数据的时候相对来说比较慢,具体的导致存储过程较慢的原因,正在探究中,欢迎各位大佬指正
package com.mdq.simpletest.demo.utils;
import java.sql.*;
public class MySQLDemo {
// MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/usertest";
// MySQL 8.0 以上版本 - JDBC 驱动名及数据库 URL
//static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
//static final String DB_URL = "jdbc:mysql://localhost:3306/RUNOOB?useSSL=false&serverTimezone=UTC";
// 数据库的用户名与密码,需要根据自己的设置
static final String USER = "root";
static final String PASS = "root";
public static void main(String[] args) {
Connection conn = null;
// Statement stmt = null;
try {
// 注册 JDBC 驱动
Class.forName(JDBC_DRIVER);
// 打开链接
System.out.println("连接数据库...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
test1(conn);
// exec3(conn);
// 执行查询
// System.out.println(" 实例化Statement对象...");
// stmt = conn.createStatement();
// String sql;
// sql = "SELECT id, name, url FROM websites";
// ResultSet rs = stmt.executeQuery(sql);
//
// // 展开结果集数据库
// while(rs.next()){
// // 通过字段检索
// int id = rs.getInt("id");
// String name = rs.getString("name");
// String url = rs.getString("url");
//
// // 输出数据
// System.out.print("ID: " + id);
// System.out.print(", 站点名称: " + name);
// System.out.print(", 站点 URL: " + url);
// System.out.print("n");
// }
// 完成后关闭
// rs.close();
// stmt.close();
conn.close();
} catch (SQLException se) {
// 处理 JDBC 错误
se.printStackTrace();
} catch (Exception e) {
// 处理 Class.forName 错误
e.printStackTrace();
} finally {
// 关闭资源
// try{
// if(stmt!=null)
// stmt.close();
// }catch(SQLException se2){
// }// 什么都不做
try {
if (conn != null) {
conn.close();
}
} catch (SQLException se) {
se.printStackTrace();
}
// }
System.out.println("Goodbye!");
}
}
public static void exec3(Connection conn){
try {
Date now = new Date(System.currentTimeMillis());
conn.setAutoCommit(false);
Long beginTime = System.currentTimeMillis();
//构造预处理statement
PreparedStatement pst = conn.prepareStatement("insert into user(name,age,create_time,update_time) values (?,?,?,?)");
//1万次循环
for(int i=1;i<=4000000;i++){
pst.setString(1,"test"+i);
pst.setInt(2,10);
pst.setDate(3,now);
pst.setDate(4,now);
pst.addBatch();
//每1000次提交一次
if(i%25000==0){//可以设置不同的大小;如50,100,500,1000等等
pst.executeBatch();
conn.commit();
pst.clearBatch();
}
}
Long endTime = System.currentTimeMillis();
System.out.println("批处理执行时间:"+(endTime-beginTime)/1000+"秒");
pst.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void test1(Connection conn) throws Exception
{
Long beginTime = System.currentTimeMillis();
String sql = "{CALL insertuserdata()}"; //调用存储过程
CallableStatement cstm = conn.prepareCall(sql); //实例化对象cstm
//cstm.setString(1, "myd"); //存储过程输入参数
//cstm.setInt(2, 2); // 存储过程输入参数
// cstm.registerOutParameter(2, Types.INTEGER); // 设置返回值类型 即返回值
cstm.execute(); // 执行存储过程
Long endTime = System.currentTimeMillis();
System.out.println("批处理执行时间:"+(endTime-beginTime)/1000+"秒");
//System.out.println(cstm.getInt(2));
cstm.close();
}
}
最后
以上就是完美皮带最近收集整理的关于jdbc进行百万数据插入的全部内容,更多相关jdbc进行百万数据插入内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复