最近用到了利用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端缓存数据。而通过存储过程迭代的返回小批量数据

JDBC性能优化方案的更多相关文章

  1. mysql 性能优化方案

    网 上有不少MySQL 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

  2. mysql 性能优化方案1

    网 上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

  3. (转)Web性能优化方案

    第一章 打开网站慢现状分析 在公司访问部署在IDC机房的VIP网站时会感觉很慢.是什么原因造成的?为了缩短页面的响应时间,改进我们的用户体验,我们需要知道用户的时间花在等待什么东西上. 可以跟踪一下我 ...

  4. mysql 性能优化方案 (转)

    网 上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

  5. Redmine性能优化方案

    近来公司redmine服务器表现很糟糕,在16核,64GRAM的机器上,压测结果竟然只有每秒5~7个请求,部分页面一个都出不来. 以下是我对Redmine性能优化方案: redmine服务器性能问题排 ...

  6. Web性能优化方案

    第一章 打开网站慢现状分析 在公司访问部署在IDC机房的VIP网站时会感觉很慢.是什么原因造成的?为了缩短页面的响应时间,改进我们的用户体验,我们需要知道用户的时间花在等待什么东西上. 可以跟踪一下我 ...

  7. 老李分享:MySql的insert语句的性能优化方案

    老李分享:MySql的insert语句的性能优化方案   性能优化一直是测试人员比较感兴趣的内容,poptest在培训学员的时候也加大了性能测试调优的方面的内容,而性能优化需要经验的积累,经验的积累依 ...

  8. DedeCMS数据负载性能优化方案简单几招让你提速N倍

    前文介绍了DedeCMS栏目列表页实现完美分页的方法,避免了大部分重复栏目标题对搜索引擎的影响,对SEO更有利.今天,分享一下DedeCMS数据负载性能优化的方法. 接触织梦也有三年多时间了,对它可谓 ...

  9. GNU Linux高并发性能优化方案

    /*********************************************************** * Author : Samson * Date : 07/14/2015 * ...

随机推荐

  1. 百度之星初赛(A)——T6

    度度熊的01世界 Problem Description 度度熊是一个喜欢计算机的孩子,在计算机的世界中,所有事物实际上都只由0和1组成. 现在给你一个n*m的图像,你需要分辨他究竟是0,还是1,或者 ...

  2. Hibernate中多种方式解除延迟加载

    问题引发:因为dao使用load(),默认延迟加载的,当在biz关闭session之后,UI层无法获取对象的非id属性值 解决方案: 1.变成get,即时加载 2.用Hibernate.isIniti ...

  3. 行为型设计模式之职责链模式(Chain of Responsibility)

    结构 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个 ...

  4. QT5.3.1 Quick 开发 --- 项目类型的选择(转)

    原文转自 https://www.cnblogs.com/aoldman/p/3966025.html 作为一个转行QT开发的新手,面对基于QML的开发时候 看到很多的项目类型感到很困惑,不知道应该怎 ...

  5. 转 DNS原理及其解析过程【精彩剖析】

    DNS原理及其解析过程[精彩剖析] http://369369.blog.51cto.com/319630/812889/   DNS原理及其解析过程 精彩剖析         网络通讯大部分是基于T ...

  6. PHP开发笔记(一)

    Location of the Android sdk has not been setup in the preference. 分析与解决: 第一次安装好adt后, 选择android sdk的路 ...

  7. commons-lang3中DateUtils类方法介绍

    添加commons-lang3的Maven依赖 <dependency> <groupId>org.apache.commons</groupId> <art ...

  8. 解决provisional headers are shown问题

    前端通过ajax的get请求向后端发送数据,后端死活收不到. ajax代码如下: $.ajax({ url:"/news_list", type:"GET", ...

  9. Selenium2+python自动化17-JS处理滚动条【转载】

    前言 selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 常见场景: 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的. 这时候 ...

  10. 使用dom4j工具包对xml文件解析

    xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http: ...