JDBC批量插入mysql数据

  • 单线程(单条循环)插入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);
            }
    }
    
  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用ShardingJDBC进行批量插入的示例代码: ``` import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm; import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm; import org.apache.shardingsphere.api.sharding.standard.StandardShardingStrategyConfiguration; import org.apache.shardingsphere.driver.api.ShardingDataSourceFactory; import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSource; import org.apache.shardingsphere.shardingjdbc.jdbc.core.datasource.ShardingDataSourceWrapper; import org.apache.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingPreparedStatement; import org.apache.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingStatement; import com.alibaba.druid.pool.DruidDataSource; public class ShardingJDBCBatchInsertExample { public static void main(String[] args) throws SQLException { // 配置分库 List<DruidDataSource> dataSourceList = new ArrayList<>(); for (int i = 0; i < 2; i++) { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/db" + i + "?serverTimezone=UTC&useSSL=false"); dataSource.setUsername("root"); dataSource.setPassword("root"); dataSourceList.add(dataSource); } // 配置分表 PreciseShardingAlgorithm<Long> preciseShardingAlgorithm = (databaseNames, shardingValue) -> { for (String each : databaseNames) { if (each.endsWith(shardingValue.getValue() % 2 + "")) { return each; } } throw new UnsupportedOperationException(); }; RangeShardingAlgorithm<Long> rangeShardingAlgorithm = (databaseNames, shardingValue) -> { List<String> result = new ArrayList<>(); Long lowerValue = shardingValue.getValueRange().lowerEndpoint(); Long upperValue = shardingValue.getValueRange().upperEndpoint(); for (String each : databaseNames) { String value = each.substring(each.length() - 1); Long intValue = Long.parseLong(value); if (intValue >= lowerValue && intValue <= upperValue) { result.add(each); } } return result; }; StandardShardingStrategyConfiguration databaseShardingStrategyConfiguration = new StandardShardingStrategyConfiguration("id", preciseShardingAlgorithm, rangeShardingAlgorithm); ShardingDataSource shardingDataSource = ShardingDataSourceFactory.createDataSource(dataSourceList, Collections.singleton(databaseShardingStrategyConfiguration), new Properties()); // 执行批量插入 Connection conn = shardingDataSource.getConnection(); String sql = "insert into t_order (id, user_id, status) values (?, ?, ?)"; ShardingPreparedStatement pstmt = (ShardingPreparedStatement) conn.prepareStatement(sql); for (int i = 1; i <= 100; i++) { pstmt.setLong(1, i); pstmt.setLong(2, i % 10); pstmt.setString(3, "INIT"); pstmt.addBatch(); } pstmt.executeBatch(); conn.close(); } } ``` 该示例代码中,我们首先配置了两个Druid数据源,分别对应两个数据库db0和db1。然后,我们使用PreciseShardingAlgorithm和RangeShardingAlgorithm两种算法配置分库分表策略。具体而言,我们根据订单ID(id)的值来判断该订单属于哪个数据库和表,其中id % 2的值为0时,订单会被分配到db0数据库,否则分配到db1数据库;对于每个数据库,我们又根据id值的范围来判断该订单属于哪个表。 在执行批量插入时,我们首先通过shardingDataSource.getConnection()方法获取一个连接。然后,我们构造一个PreparedStatement对象,设置好参数,调用addBatch()方法将数据加入批处理队列中,最后调用executeBatch()方法执行批处理操作。由于使用了ShardingJDBC,ShardingPreparedStatement对象会在内部根据id值的分片规则自动将订单插入到对应的数据库和表中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

讓丄帝愛伱

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

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

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

打赏作者

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

抵扣说明:

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

余额充值