IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> JDBC五:批量操作的四层优化 -> 正文阅读

[大数据]JDBC五:批量操作的四层优化

批量操作

导读

  1. 预编译优势

    DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不与要再编译,只要将参数直接传入编译过的语句中就会得到执行。

  2. Statement语句中,无法进行预编译,每次执行sql语句,都会进行语法检查、语义检查、再翻译成二进制命令、缓存等操作,对于批量操作极为浪费资源

  3. Batch方法及将AutoCommit的默认值设为false,都是为了减少PerparedStatement与数据库的交互次数

一、批量操作层次一

  1. 使用Statement,没有预编译,会进行多次次的语法检查等操作,效率低

  2. 插入20,000条数据所用时间为:22189ms

    @Test
        public void testStatement() {
            Long start = System.currentTimeMillis();
            Connection conn = null;
            Statement st = null;
            try {
                conn = JdbcUtils.getConnection();
                st = conn.createStatement();
                for (int i = 0; i < 20000; i++) {
                    // Statement处理sql语句时,会用到拼串
                    String sql = "insert into customers(cust_name) values('name_" + i + "')";
                    st.execute(sql);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JdbcUtils.closeResource(conn,st);
            }
            Long end = System.currentTimeMillis();
            // Statement插入20000条数据所用时间为:22189
            System.out.println("Statement插入20000条数据所用时间为:" + (end - start));
        }
    

二、批量操作层次二

  1. 使用PreparedStatement,可以进行预编译,不用重复进行语法检查、语义检查等操作,但仍然需要和数据库进行N次交互

  2. 插入20,000条数据操作所需时间:22164ms

    @Test
        public void testPreparedStatement2() {
            Long start = System.currentTimeMillis();
            Connection conn = null;
            PreparedStatement ps = null;
            try {
                conn = JdbcUtils.getConnection();
                String sql = "insert into customers(cust_name) values(?)";
                ps = conn.prepareStatement(sql);
                for (int i = 0; i < 20000; i++) {
                    ps.setObject(1,"name_" + i);
                    // 如果execute()放在循环外,则只会执行for循环的最后一次结果,因为setObject方法的参数索引值一直为1
                    ps.execute();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JdbcUtils.closeResource(conn,ps);
            }
            Long end = System.currentTimeMillis();
            // PreparedStatement普通预编译执行插入20000条数据操作所需时间:22164
            System.out.println("PreparedStatement普通预编译执行插入20000条数据操作所需时间:" + (end - start));
        }
    

三、批量操作层次三

  1. PreparedStatement使用了addBatch()、executeBatch()、clearBatch()方法,可以形成一定的执行缓存,减少与数据库的交互,极大提升效率

  2. 需要在配置文件jdbc.properties中,在url字符串后增加 ?rewriteBatchedStatements=true ,确使Batch方法可用,jar包需在5.1.37之上

  3. 插入20,000条数据的时间为359ms

    @Test
        public void testPreparedStatement3() {
            Long start = System.currentTimeMillis();
            Connection conn = null;
            PreparedStatement ps = null;
            try {
                conn = JdbcUtils.getConnection();
                String sql = "insert into customers(cust_name) values(?)";
                ps = conn.prepareStatement(sql);
                for (int i = 0; i < 1000000; i++) {
                    ps.setObject(1,"name_" + i);
                    // 添加需要批量处理的sql语句或参数
                    ps.addBatch();
                    // 相当于建立了一个容量为500的缓存池
                    if (i % 500 == 0) {
                        // 一次性处理缓存池内的sql,可以减少于数据库的交互
                        ps.executeBatch();
                        // 清空缓存的数据
                        ps.clearBatch();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JdbcUtils.closeResource(conn,ps);
            }
            Long end = System.currentTimeMillis();
            // PreparedStatement使用Batch执行插入20000条数据操作所需时间:359
            System.out.println("PreparedStatement使用Batch执行插入20000条数据操作所需时间:" + (end - start));
        }
    

四、批量操作层次四

  1. 则使用Batch的基础上,将自动提交AutoCommit的默认值设置为false,使ps与数据库的交互只有一次,则效率就更高了

  2. DML的提交及回顾问题参考博文:MySQL十: DDL (数据库/数据表的增、查、改、删)

  3. 插入1,000,000条数据使用时间为5345ms

     @Test
        public void testPreparedStatement4() {
            Long start = System.currentTimeMillis();
            Connection conn = null;
            PreparedStatement ps = null;
            try {
                conn = JdbcUtils.getConnection();
                // 设置DML操作不会自动提交,则可以使ps在使用Batch高效的全部处理完sql后,再一次性与数据库交互
                conn.setAutoCommit(false);
                String sql = "insert into customers(cust_name) values(?)";
    
                ps = conn.prepareStatement(sql);
                for (int i = 0; i < 1000000; i++) {
                    ps.setObject(1,"name_" + i);
                    // 添加需要批量处理的sql语句或参数
                    ps.addBatch();
                    // 相当于建立了一个容量为500的缓存池
                    if (i % 500 == 0) {
                        // 一次性处理缓存池内的sql,可以减少于数据库的交互
                        ps.executeBatch();
                        // 清空缓存的数据
                        ps.clearBatch();
                    }
                }
                // 在ps使用Batch高效的全部处理完sql后,一次性与数据库交互
                conn.commit();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JdbcUtils.closeResource(conn,ps);
            }
            Long end = System.currentTimeMillis();
            // PreparedStatement更改commit后执行插入1000000条数据操作所需时间:5345
            System.out.println("PreparedStatement更改commit后执行插入1000000条数据操作所需时间:" + (end - start));
        }
    
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:39:53  更:2022-01-25 10:42:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:28:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码