zoukankan      html  css  js  c++  java
  • 批量插入数据操作

     使用PreparedStatement实现批量数据操作
     此时的批量操作,主要指的是批量插入。
     使用PreparedStatement如何实现更高效的批量插入

    CREATE TABLE goods(
                     id INT PRIMARY KEY AUTO_INCREMENT,
                     NAME VARCHAR(25)
    );

    PreparedStatementBatch

    package com.aff.PreparedStatement;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import org.junit.Test;
    import com.aff.utils.JDBCUtils;
    
    /*
     * 使用PreparedStatement实现批量数据操作
     * 此时的批量操作,主要指的是批量插入。
     * 使用PreparedStatement如何实现更高效的批量插入
     * 
     * CREATE TABLE goods(
             id INT PRIMARY KEY AUTO_INCREMENT,
             NAME VARCHAR(25)
    );
     */
    public class PreparedStatementBatch {
        // 插入方式一:使用Statement 效率慢,而且有sql注入问题, 直接舍弃
    
        // 插入方式二:使用PreparedStatement
        @Test
        public void testInsert() {
            Connection conn = null;
            PreparedStatement ps = null;
            try {
                long start = System.currentTimeMillis();
                conn = JDBCUtils.getConnection();
                String sql = "insert into goods(name) values(?)";
                ps = conn.prepareStatement(sql);
                for (int i = 1; i <= 10000; i++) {
                    // 填充占位符,填上
                    ps.setObject(1, "name_" + i);
                    ps.execute();// 执行
                }
                long end = System.currentTimeMillis();
                System.out.println("花费时间:" + (end - start));//插入一万条数据花费时间:347702
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JDBCUtils.closeResource(conn, ps);
            }
        }
    
        
        
        // 批量插入的方式三:
        //                 1. ①addBatch()   ②executeBatch()   ③clearBatch()
        //                 2. mysql服务器默认是关闭处理的,我们需要通过一个参数,让mysql开启批处理的支持
        //                     url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true
        //                 3. 使用更新的mysql驱动:mysql-connector-java-5.1.37-bin.jar
        @Test
        public void testBatch() {
            Connection conn = null;
            PreparedStatement ps = null;
            try {
                long start = System.currentTimeMillis();
                conn = JDBCUtils.getConnection();
                String sql = "insert into goods(name) values(?)";
                ps = conn.prepareStatement(sql);
                for (int i = 1; i <= 1000000; i++) {
                    // 填充占位符,填上
                    ps.setObject(1, "name_" + i);
    
                    // 1.攒sql
                    ps.addBatch();
                    if (i % 500 == 0) {
                        // 2.执行batch
                        ps.executeBatch();
                        // 3清空batch
                        ps.clearBatch();
                    }
                }
                long end = System.currentTimeMillis();
                System.out.println("花费时间:" + (end - start));
    //插入一万条数据花费时间:347702-->2777 //数据改成一百万,花费时间:95374 } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.closeResource(conn, ps); } } // 批量插入的方式四:最终版 @Test public void testBatch2() { Connection conn = null; PreparedStatement ps = null; try { long start = System.currentTimeMillis(); conn = JDBCUtils.getConnection(); //设置不允许自动提交数据 conn.setAutoCommit(false); String sql = "insert into goods(name) values(?)"; ps = conn.prepareStatement(sql); for (int i = 1; i <= 1000000; i++) { // 填充占位符,填上 ps.setObject(1, "name_" + i); // 1.攒sql ps.addBatch(); if (i % 500 == 0) { // 2.执行batch ps.executeBatch(); // 3清空batch ps.clearBatch(); } } //当整个执行完后,提交数据 conn.commit(); long end = System.currentTimeMillis(); System.out.println("花费时间:" + (end - start)); //数据改成一百万,花费时间:95374--->花费时间:9790 } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.closeResource(conn, ps); } } }
    All that work will definitely pay off
  • 相关阅读:
    Python 极简教程(十)集合 set
    Python 极简教程(九)元组 tuple
    Python 极简教程(七)列表 list
    Python 极简教程(八)字符串 str
    DevOps实践之一:基于Docker构建企业Jenkins CI平台
    kubernetes实践之一:kubernetes二进制包安装
    Linux挖矿病毒 khugepageds详细解决步骤
    kubernetes实践之五:深入理解Service及内部DNS搭建
    kubernetes实践之四:深入理解控制器(workload)
    kubernetes实践之三:深入理解Pod对象
  • 原文地址:https://www.cnblogs.com/afangfang/p/12678469.html
Copyright © 2011-2022 走看看