4.设置检索时的批量值
Statement.getFetchSize();
获取一次检索的批量值
Statement.setFetchSize(30); 设置批量值
传统情况下,设置FetchSize值对检索大数据表时性能的提升是很明显的,原因是jdbc驱动默认每次只检索10条记录(传到客户端的应该是一个游标),如果我们要检索100条数据,那么就需要客户端和服务器端进行10次网络往返才能全部传输完毕,每次网络间传输都会耗掉一些时间,比如采用TCP/IP协议的话,要建立连接握手及额外的协议头尾开销等,这样势必会影响客户端的响应。至于JDBC为何要设计这么小的数,有人说是为了避免jvm
out of memory 问题。
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端缓存数据,而通过存储过程迭代的返回小批量数据