我正在使用此代码从数据库加载数据:
PreparedStatement inputStmt = connection.prepareStatement("select * from A");
inputStmt.setFetchSize(3000);
inputStmt.executeQuery();
由于我使用的是setFetchSize,我知道请求一次只能获取3000行,如果需要,它将获取接下来的3000行......
我的问题是:当我们获取第二个3000行时,第一个3000仍然在缓存中吗?
因为我正在阅读一张包含数百万行的表,如果我管理不好,我的callc会出现内存问题。
答案 0 :(得分:2)
默认ResultSet
类型为ResultSet.TYPE_FORWARD_ONLY
,这意味着您一次只能前进一行。除非驱动程序的实现非常糟糕,否则它将不再在内存中保留任何无法访问的行。
默认提取大小因驱动程序而异。有些默认情况下加载完整的结果集(例如Postgres),其他的则具有较小的提取大小(例如Oracle),这对于某些类型的任务甚至可能无效。