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条记录(传到客户端的应该是一个游标),如果我们要检索100条数据,那么就需要客户端和服务器端进行10次网络往返才能全部传输完毕,每次网络间传输都会耗掉一些时间,比如采用TCP/IP协议的话,要建立连接握手及额外的协议头尾开销等,这样势必会影响客户端的响应。至于JDBC为何要设计这么小的数,有人说是为了避免jvm
out of memory 问题。

具体性能能提高多少,请参考:http://blog.lishman.com/2008/03/jdbc-fetch-size.html 

当然,FetchSize并不是越大越好,至于原因请参考:http://stackoverflow.com/questions/9220171/setting-oracle-size-of-row-fetches-higher-makes-my-app-slower 

  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端缓存数据,而通过存储过程迭代的返回小批量数据
时间: 2024-09-17 04:47:37

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

Mysql性能优化方案分享_Mysql

网上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果,因此简单地根据某个给出方案来配置mysql是行不通的,最好能使用status信息对mysql进行具体的优化. mysql> show global status; 可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句:mysql> show variables; 一.慢查询 m

Nginx服务器配置性能优化方案_nginx

高层的配置nginx.conf文件中,Nginx中有少数的几个高级配置在模块部分之上. user www-data; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofile 100000; user和pid应该按默认设置 - 我们不会更改这些内容,因为更改与否没有什么不同. worker_processes 定义了nginx对外提供web服务时的worker进程数.最优值取决于许多因素,包括(但不限于)CPU核的数量

mysql 性能优化方案

网上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与负责,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果,因此简单地根据某个给出方案来配置mysql是行不通的,最好能使用status信息对mysql进行具体的优化,网上找了一篇文章,分页分得乱七八糟的,只能转到博客. mysql> show global status; 可以列出mysql服务器运行各种状态值,另外,查询mysql服务器配置信息语句: m

JDBC学习笔记-jdbc性能优化

笔记|性能|优化 jdbc程序的性能主要由两个因素决定,一是数据库本身的性质,另一个是与数据库相对独立的jdbc应用程序接口(api)的使用.这里说的是如何正确使用jdbc编程接口,以获得更好的性能. jdbc主要优化有: 1.选择正确的jdbc驱动程序 2.Connention的优化 使用连接池来管理Connection对象 3.Statement的优化 使用批量更新等 4.Result的优化 正确的从数据库中get数据等 (1)选择正确的jdbc驱动程序: 1 jdbc-odbc 桥 2 本

iSCSI性能瓶颈及性能优化方案

iSCSI性能瓶颈 &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   iSCSI协议建立在传统的TCP/IP协议之上,在进行实际数据传输时,其传输系统性能受限于TCP/IP协议栈负载及以太网最大带宽,另外iSCSI协议层也会额外增加一些负载开销,在实际应用中,iSCSI数据传输性能仍然存在瓶颈.以发送端的写操作为例,一次完整的iSCSI协议数据传输包括数据封装.数据拷贝.数据传输三个步骤. 1.数据封装 iSC

Nginx 服务器性能Bug和性能优化方案(真实经历)

一.遇到的问题 1.问题:本应该是3个ffmpeg ,但是怎么会有5个ffmpeg出现? 2.Lua脚本问题,一直写入日志,导致有大量的日志,这里的错误日志是直接写进nginx的error.log 日志文件的 (1)日志文件 total 1.8G -rw-r--r-- 1 root root 11M May 9 21:47 access.log -rw-r--r-- 1 root root 3.1K May 9 21:46 error.log -rw-r--r-- 1 root root 705

oracle数据库性能优化方案精髓整理收集回顾

oracle数据库性能优化总体法则: 一.减少数据访问(减少硬盘房访问次数) 二.返回更少的数据(减少网络传输或磁盘访问) 三.减少交互次数(减少网络传输) 四.减少服务器开销(减少cpu及内存开销) 五.利用更多的资源(增加资源) ===================具体说明================= 一.减少数据访问(减少硬盘房访问次数) 1.减少数据访问 1.1.创建并使用正确的索引 索引会大大增加DML(增删改)的开销[合理的索引会大大提高效率100倍.1000倍,但不合理的索

java性能优化方案5——使用原始类型和栈

5.使用原始类型和栈之前介绍了来自 jOOQ的例子中使用了大量的泛型,导致的结果是使用了 byte. short. int 和 long 的包装类.但至少泛型在Java 10或者Valhalla项目中被专门化之前,不应该成为代码的限制.因为可以通过下面的方法来进行替换://存储在堆上Integer i = 817598;--如果这样写的话:// 存储在栈上int i = 817598;在使用数组时情况可能会变得更加糟糕://在堆上生成了三个对象Integer[] i = { 1337, 4242

Java toString的性能优化方案比较

谁在关心toString的性能?没有人!除非当你有大量的数据在批量处理,使用toString产生了许多日志.然后,你去调查为何如此之慢,才意识到大部分的toString方法使用的是introspection,它其实是可以被优化的. 不过,首先让我们一起看看Javadoc回忆下Object.toString应 当做什么:"返回该对象的字符串表示,该结果必须简明但表述详实易懂.建议所有子类重写该方法".这里最有趣的就是"简明"和"详实".我们所钟爱的