概述
最近没事比较了下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进行百万数据插入所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复