日期:2014-05-20  浏览次数:20810 次

300万件数据测试时,使用setFetchSize方法疑惑
PreParedStatement的setFetchSize方法

300万条数据时,不设置是一定不行的。

我想问两个问题。

1。比如10条数据,setFetchSize大小设置为1,会执行十次数据库的访问吗?

2。300万件时,setFetchSize大小设置为1是否合理,如果不合理,设置为多少合适?

------解决方案--------------------
这个只会分批返回数据,但无法完成分页吧?
------解决方案--------------------
其实API说的很清楚:
Gives the JDBC driver a hint as to the number of rows that should be fetched from the database when more rows are needed for ResultSet objects genrated by this Statement. If the value specified is zero, then the hint is ignored. The default value is zero.

给JDBC驱动一个指导性参考意见,让JDBC每次从数据库端读取时,获取多少行数据比较合适。


接下来回答你这两个问题:
1。比如10条数据,setFetchSize大小设置为1,会执行十次数据库的访问吗?
——先假定你的意思是 Select top 10 ,并且程序会 while(next()) 全部都遍历一遍。
——那么:有可能(对,只是有可能,因为JDBC驱动可能会嫌你这个值太小了而取一个比该值大的数,具体要看不同JDBC驱动的实现)。但并不是10次数据库连接或10次查询,而是相当于发送十次next的指令给数据库端,然后取回1行数据集;

2。300万件时,setFetchSize大小设置为1是否合理,如果不合理,设置为多少合适?
——当然不合理。还不如直接设置为0,让JDBC驱动自行决定。
——你的这个要求,相当于是让JDBC每次从数据库端load回多少行数据,太大了也没必要,我个人觉得视你的数据行大小而定,如果你数据行字段很少可以多设置几行;如果数据行字段数量很多,你设置太大了内存开销就会太高,每次读取的网络延时也比较长。
——另一个推算依据是每次程序能处理的量,如果你的程序每秒钟能处理1000行数据,那么不妨就设置为1000。