JDBC性能优化方案

简介:    近期用到了利用JDBC查询Oracle数据库,但是查询效率不尽人意,研究了一下JDBC方面可以优化的地方,在这里跟大家分享一下。   1.设置最优的预取值         defaultRowPrefetch:预取条数默认值          defaultBatchValue:触发查询操作的批量请求值         这两个参数的默认值都是10,我们可以通过增
   近期用到了利用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条记录(传到客户端的应该是一个游标),如果我们要检索100条数据,那么就需要客户端和服务器端进行10次网络往返才能全部传输完毕,每次网络间传输都会耗掉一些时间,比如采用TCP/IP协议的话,要建立连接握手及额外的协议头尾开销等,这样势必会影响客户端的响应。至于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一次请求大量数据,而应用程序可能会一次把所有数据返回给客户端,这样会用掉很多时间,可以采取如下方式解决:

  • 在Server端缓存数据,分批次发给Client端,比如Server端查询出1000条数据,可以分10批次每次传送100条给Client端
  • 不在Server端缓存数据,而通过存储过程迭代的返回小批量数据
目录
相关文章
|
6月前
|
存储 关系型数据库 MySQL
【性能优化】MySql查询性能优化必知必会
【性能优化】MySql查询性能优化必知必会
118 0
【性能优化】MySql查询性能优化必知必会
|
存储 NoSQL 算法
8个 数据库性能优化方案,你知道几个?(建议收藏) 上
8个 数据库性能优化方案,你知道几个?(建议收藏) 上
1580 0
8个 数据库性能优化方案,你知道几个?(建议收藏) 上
|
6月前
|
SQL 关系型数据库 MySQL
后端接口性能优化分析-数据库优化(上)
后端接口性能优化分析-数据库优化
151 0
|
4月前
|
缓存 前端开发 JavaScript
前端常见的性能优化方案?
【7月更文挑战第14天】前端性能优化包括代码压缩、资源合并、图片优化、缓存策略和DOM操作改进。例如,压缩CSS、JS,懒加载图片,使用CDN,事件委托,启用HTTP/2,及利用性能工具进行评估和优化。目标是加快加载速度,提升用户体验和服务器效率。
76 2
|
6月前
|
SQL 关系型数据库 MySQL
后端接口性能优化分析-数据库优化(下)
后端接口性能优化分析-数据库优化
159 1
|
6月前
|
缓存 关系型数据库 MySQL
MySQL数据库性能优化实战
【4月更文挑战第30天】本文探讨了MySQL性能优化实战技巧,包括硬件与配置优化(如使用SSD、增加内存和调整配置参数)、索引优化(创建合适索引、使用复合索引及定期维护)、查询优化(避免全表扫描、减少JOIN和使用LIMIT)、分区与分片(表分区和数据库分片),以及使用缓存、定期清理数据库和监控诊断。通过这些方法,可以提升数据库性能和响应速度。
|
SQL 缓存 关系型数据库
简述MySQL可以从哪些方面做到性能优化
数据库设计优化:良好的数据库设计是性能优化的基础。包括选择适当的数据类型、建立正确的索引以及合理划分表等。通过优化数据库结构,可以减少磁盘空间的占用和提高查询效率。
124 0
|
6月前
|
SQL 关系型数据库 MySQL
后端接口性能优化分析-数据库优化(中)
后端接口性能优化分析-数据库优化
150 0
|
存储 缓存 NoSQL
性能优化方案及思考
周末闲暇在家,朋友让我帮忙优化一个接口,这个接口之前每次加载都需要40s左右,经过优化将性能提了10倍左右;又加了缓存直接接口响应目前为300ms左右,于是将自己的优化思路整理总结一下
|
存储 缓存 NoSQL
【MySQL数据库基础 七】MySQL数据库高性能优化方案
【MySQL数据库基础 七】MySQL数据库高性能优化方案
200 0