批量数据插入操作

本文主要内容:使用PreparedStatement执行批量数据的插入

/*
 * 使用PreparedStatement实现批量数据的操作
 *
 * update、delete本事具有批量操作的效果
 * 此时的批量操作,主要值批量插入,如何使用PreparedStatement实现高效的批量插入操作?
 *
 *  题目:向goods表中插入2w条数据
 *  create table goods(id int primary key auto_increment, name varchar(24));
 *
 *  使用PreparedStatement实现高效的批量插入的原因:
 *     DBServer会对预编译语句提供性能优化,因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓在下来。那么下次调用时只要是相同的预编译语句就不需要编译。只要将参数直接传入编逢过的语句执行代码中就会得到执行。
 */

//批量插入的方式一
    @Test
    public void testInsert(){
        Connection coon = null;
        PreparedStatement ps = null;
        try {
            long start = System.currentTimeMillis();
            coon = JDBCUtils.getConnection();
            String sql = "insert into goods(name) values(?)";
            ps = coon.prepareStatement(sql);
            for (int i = 1; i <= 20000 ; i++) {
                ps.setObject(1, "name_" + i);

                ps.execute();
            }
            long end = System.currentTimeMillis();
            System.out.println("花费时间为:" + (end - start));  //2w条数据写入固态硬盘耗时14s
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeResource(coon, ps);
        }
    }

   /**
     * 批量插入方式二:
     * 1. addBatch()、executeBatch()、clearBatch()
     * 2. mysql服务器默认关闭批处理,我们需要参数开启批处理
     *    即: 将&rewriteBatchedStatements=true写在配置文件url后
     */
    @Test
    public void testInsert1(){
        Connection coon = null;
        PreparedStatement ps = null;
        try {
            long start = System.currentTimeMillis();
            coon = JDBCUtils.getConnection();
            String sql = "insert into goods(name) values(?)";
            ps = coon.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));  //2w条数据写入固态硬盘耗时0.37s||100w条数据写入固态硬盘耗时4.82s
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeResource(coon, ps);
        }
    }

   /**
     * 批量插入方式三:不允许自动提交,因为提交一次就要耗费一定的时间
     */
    @Test
    public void testInsert2(){
        Connection coon = null;
        PreparedStatement ps = null;
        try {
            long start = System.currentTimeMillis();
            coon = JDBCUtils.getConnection();
            //设置不允许自动提交
            coon.setAutoCommit(false);

            String sql = "insert into goods(name) values(?)";
            ps = coon.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();
                }
            }
            //提交结果
            coon.commit();

            long end = System.currentTimeMillis();
            System.out.println("花费时间为:" + (end - start));  //100w条数据写入固态硬盘耗时3.6s
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeResource(coon, ps);
        }
    }

本文由 WarlockMarten 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。