zoukankan      html  css  js  c++  java
  • JDBC性能优化方案

     

     
       最近用到了利用JDBC查询Oracle数据库。可是查询效率不尽人意。研究了一下JDBC方面能够优化的地方,在这里跟大家分享一下。
      1.设置最优的预取值
            defaultRowPrefetch:预取条数默认值
             defaultBatchValue:触发查询操作的批量请求值
            这两个參数的默认值都是10。我们能够通过添加这两个參数值来降低数据库请求以提高查询效率,当然详细值大小要视详细情况而定。
      2.通过连接池获取连接
         创建连接的代价非常大,通过连接池获取连接可省去创建连接时间。
      3.选择合适的Statement接口(共同拥有三种)
    • Statement:仅仅支持静态sql
    • PreparedStatement:支持动态输入參数的sql, 由于其预编译的sql具有可重用性,可极大地避免Oracle对sql的(应解析和软解析)解析时间,提高查询速度
    • CallableStatement:专门针对存储过程,使用它能享受到全部存储过程带来的优势,但也包含存储过程带来的劣势如Java程序可移植性查,依赖数据库等      
      4.设置检索时的批量值
          Statement.getFetchSize();   获取一次检索的批量值
          Statement.setFetchSize(30); 设置批量值
          传统情况下,设置FetchSize值对检索大数据表时性能的提升是非常明显的。原因是jdbc驱动默认每次仅仅检索10条记录(传到client的应该是一个游标),假设我们要检索100条数据,那么就须要client和server端进行10次网络往返才干所有传输完成。每次网络间传输都会耗掉一些时间,比方採用TCP/IP协议的话。要建立连接握手及额外的协议头尾开销等,这样势必会影响client的响应。

    至于JDBC为何要设计这么小的数。有人说是为了避免jvm out of memory 问题。

    详细性能能提高多少,请參考:http://blog.lishman.com/2008/03/jdbc-fetch-size.html 
      5.设置ResultSet的批量值
          ResultSet.getFetchSize(); 获取默认批量值
          ResultSet.setFetchSize(50); 设置批量值     
          处理大数据时可显著提高处理速度
      6.设置ResultSet合适的处理方向
           ResultSet.getFetchDirection(); 获取默认值

        ResultSet.setFetchDirection(FETCH_REVERSE);设置合适的值

      7.从ResultSet获取数据时有两种方式, rs.getObject(int column_index) 和 rs.getObject(String column_label)
    •  rs.getObject(int column_index):这样的方式直接依据索引从rs对象中取出 。最快 
    •  rs.getObject(String column_label) : 这样的方式须要先通过label获取到索引。然后再依据索引取数据,比直接利用索引多走了一步

     8.合理的使用ResultSet的getXXX()方法

        ResultSet提供了非常多各式各样的getxxx() 方法。比方你知道第一个值是String类型的话。那么就写成getString(1),假设你不指示明白的话,它会则须要把这个值再转换成合适的Java类型,转换的代价是比較大的,假设检索出来的数据有一百万条的话,那么这个字段值就会被转换一百万次。

     9.优化查询SQL

        比方避免使用select * from table where condition...,由于这么做会把全部的数据项目查询出来。比方我们仅仅须要Salary的话。我们就写成select salary from employee where name=RR,避免不必要数据的检索。

     10.Cache仅仅读(read-only)和主读(read-mostly)表的数据

        仅仅读表的数据不会发生变化。主读表发生变化较少,假设每次请求都读一遍表的话显然是没有必要,因此能够把这些数据缓存起来。当然。对于主读表要设定一定的更新时间。

     11.迭代分批次获取数据替代一次大批量获取数据

         某些情况下,应用程序可能会通过JDBC一次请求大量数据,而应用程序可能会一次把全部数据返回给client,这样会用掉非常多时间,能够採取例如以下方式解决:

    • 在Server端缓存数据,分批次发给Client端。比方Server端查询出1000条数据,能够分10批次每次传送100条给Client端
    • 不在Server端缓存数据。而通过存储过程迭代的返回小批量数据
  • 相关阅读:
    springboot实现定时任务,异步操作,统一结果返回,全局异常处理,拦截器及事务处理
    springboot集成mybatis,热部署以及整合Swagger2
    使用idea上传项目到码云(gitee)上
    RabbitMQ 高级应用
    Spring Boot整合RabbitMQ
    RabbitMQ--其他几种模式
    RabbitMQ入门--简单模式
    RabbitMQ安装(centos7)
    RocketMQ安装及入门
    [UWP]涨姿势UWP源码——极简的RSS阅读器
  • 原文地址:https://www.cnblogs.com/firstdream/p/7834912.html
Copyright © 2011-2022 走看看