JDBC批量插入mysql数据

文章比较了单线程逐条插入50000条记录与多线程批量插入的方法,展示了使用`stmt.addBatch()`和`executeBatch()`进行性能提升的可能性。同时讨论了多线程情况下如何分配任务以减少数据库访问次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 单线程(单条循环)插入50000条记录:
    每执行一次就要访问一次数据库

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
     
     
    public class Test {
     
        public static void main(String[] args) {
             
             Connection conn;
             Statement stmt;
             ResultSet rs = null;
             String url = "jdbc:sqlserver://localhost:1433;DatabaseName=test;";
             String sql = "insert into student(name,age) values('wang',12)";
             try {
                 // 连接数据库
                 conn = DriverManager.getConnection(url, "sa", "123456");
                 // 建立Statement对象
                 stmt = conn.createStatement();
                 /**
                  * Statement createStatement() 创建一个 Statement 对象来将 SQL 语句发送到数据库。
                  */
                 // 执行数据库查询语句
                 long starttime=System.currentTimeMillis();
                 for(int i=0; i<50000;i++){
                     stmt.executeUpdate(sql);
                 }
                 long spendtime=System.currentTimeMillis()-starttime;
                 System.out.println( "单线程批处理花费时间:"+spendtime);
                 /**
                  * ResultSet executeQuery(String sql) throws SQLException 执行给定的 SQL
                  * 语句,该语句返回单个 ResultSet 对象
                  */
                 if (rs != null) {
                     rs.close();
                     rs = null;
                 }
                 if (stmt != null) {
                     stmt.close();
                     stmt = null;
                 }
                 if (conn != null) {
                     conn.close();
                     conn = null;
                 }
             } catch (SQLException e) {
                 e.printStackTrace();
                 System.out.println("数据库连接失败");
             }       
        }   
    }
    
  • 单线程(批处理)插入50000条记录:
    stmt.addBatch():把要执行的多条sql语句放在一起,通过stmt.executeBatch()只访问一次数据库,就前面的多条sql语句一起插入

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
     
    public class Test {
     
        public static void main(String[] args) {
             
             Connection conn;
             Statement stmt;
             ResultSet rs = null;
             String url = "jdbc:sqlserver://localhost:1433;DatabaseName=test;";
             String sql = "insert into student(name,age) values('wang',12)";
             try {
                 // 连接数据库
                 conn = DriverManager.getConnection(url, "sa", "123456");
                 // 建立Statement对象
                 stmt = conn.createStatement();
                 /**
                  * Statement createStatement() 创建一个 Statement 对象来将 SQL 语句发送到数据库。
                  */
                 // 执行数据库查询语句
                 long starttime=System.currentTimeMillis();
                 for(int i=0; i<50000;i++){
                     stmt.addBatch("insert into student(name,age) values('wang',12)");
                 }
                 stmt.executeBatch();
                 long spendtime=System.currentTimeMillis()-starttime;
                 System.out.println( "单线程批处理花费时间:"+spendtime);
                 /**
                  * ResultSet executeQuery(String sql) throws SQLException 执行给定的 SQL
                  * 语句,该语句返回单个 ResultSet 对象
                  */
                 if (rs != null) {
                     rs.close();
                     rs = null;
                 }
                 if (stmt != null) {
                     stmt.close();
                     stmt = null;
                 }
                 if (conn != null) {
                     conn.close();
                     conn = null;
                 }
             } catch (SQLException e) {
                 e.printStackTrace();
                 System.out.println("数据库连接失败");
             } 
        }   
    }
    
  • 多线程(单条循环)插入50000条记录:
    启动5个线程,每个线程插入10000条记录

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.UUID;
    import java.util.concurrent.CountDownLatch;
     
     
    public class InsertTest {
     
          private String url="jdbc:sqlserver://localhost:1433;DatabaseName=test;";
            private String user="sa";
            private String password="123456";
            public Connection getConnect(){
                Connection con = null;
                 try {
                    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                    con=DriverManager.getConnection(url, user, password);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                 return con;
            }
            public void multiThreadImport( final int ThreadNum){
                final CountDownLatch cdl= new CountDownLatch(ThreadNum);
                long starttime=System.currentTimeMillis();
                for(int k=1;k<=ThreadNum;k++){
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            Connection con=getConnect();
                            try {
                                Statement st=con.createStatement();
                                for(int i=1;i<=10000;i++){
                                    //st.addBatch("insert into student(name,age) values('wang',12)");
                                    st.executeUpdate("insert into student(name,age) values('wang',12)");
                                }
                                //st.executeBatch();
                                cdl.countDown();
                            } catch (Exception e) {
                            }finally{
                                try {
                                    con.close();
                                } catch (SQLException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    }).start();
                }
                try {
                    cdl.await();
                    long spendtime=System.currentTimeMillis()-starttime;
                    System.out.println( ThreadNum+"个线程花费时间:"+spendtime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
     
            }
     
            public static void main(String[] args) throws Exception {
                InsertTest ti=new InsertTest();
                ti.multiThreadImport(5);
            }
    }
    
  • 多线程+批处理插入50000条记录:
    启动5个线程

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.UUID;
    import java.util.concurrent.CountDownLatch;
     
     
    public class InsertTest {
     
          private String url="jdbc:sqlserver://localhost:1433;DatabaseName=test;";
            private String user="sa";
            private String password="Rfid123456";
            public Connection getConnect(){
                Connection con = null;
                 try {
                    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                    con=DriverManager.getConnection(url, user, password);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                 return con;
            }
            public void multiThreadImport( final int ThreadNum){
                final CountDownLatch cdl= new CountDownLatch(ThreadNum);//定义线程数量
                long starttime=System.currentTimeMillis();
                for(int k=1;k<=ThreadNum;k++){
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            Connection con=getConnect();
                            try {
                                Statement st=con.createStatement();
                                for(int i=1;i<=50000/ThreadNum;i++){
                                    st.addBatch("insert into student(name,age) values('wang',12)");
                                    if(i%500 == 0){
                                        st.executeBatch();
                                    }
                                }
                                cdl.countDown();    //执行完一个线程,递减1
                            } catch (Exception e) {
                            }finally{
                                try {
                                    con.close();
                                } catch (SQLException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    }).start();
                }
                try {
                    cdl.await();    //前面线程没执行完,其他线程等待,不往下执行
                    long spendtime=System.currentTimeMillis()-starttime;
                    System.out.println( ThreadNum+"个线程花费时间:"+spendtime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
     
            }
     
            public static void main(String[] args) throws Exception {
                InsertTest ti=new InsertTest();
                ti.multiThreadImport(5);
            }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

讓丄帝愛伱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值