JDBC的statement对象,有一个setFetchSize方法,参数是一个int值,其作用是,执行查询时,一次从服务器端拿多少行的数据到本地jdbc客户端这里来
还有一个方法:setMaxRows,这个方法,作用是JDBC最多返回多少行数据给调用者。举个例子:
一个表,有100行数据,sql语句为select * from table,fetchsize设置为20,maxrows设置为50,则:
数据库服务器端在执行这个查询的时候,会在内部维护一个游标(hander),调用者在执行resultset.next()的时候,JDBC会先与服务器端进行通信,取20条数据到jdbc的客户端中,然后返回第一条给调用者,当调用者取到第21条数据的时候,又会触发jdbc到数据库服务端拿数据,又拿20条,返回第21条给调用者。。。当调用者要拿第41条数据的时候,jdbc这时不是去数据库服务器端拿20条了,而是10条,因为maxrows为50,最多取50,之前已经取出40条了,所以只剩10条可取。
为什么要设置fetchsize?显然,这样设置,就避免了服务器一下子把所有结果都塞到客户端来了,将客户端的内存资源给撑爆掉了。比如:一行数据就是100M大小,如果JDBC一下子取50条,就需要5G的内存,而每次取10条,那么,就只需要1G内存就可以了,客户端的资源将变的可控!
上面解释了fetchsize参数的作用,下面说下我遇到的坑:</