从数据库获取数据块以节省内存

时间:2015-10-13 11:12:06

标签: java

我的问题与JDBC查询有关,其中表中的记录数量很大。最终目标是以流式方式从DB获取数据,然后通过块获取数据块。

这可以通过LIMIT,OFFSET等关键字创建多个SQL语句来实现。但在这种情况下,会有多个数据库调用会花费更多时间。 有没有办法你不将整个结果集加载到内存和放大器中。可以在没有额外数据库调用的情况下以块的形式获取数据吗?

由于

1 个答案:

答案 0 :(得分:2)

首先,如果从数据库中获取数据块,则将进行多个数据库调用。您将不会执行任意数量的查询。

第二,是的,这是可能的。有一种称为“光标”的DB概念。

Connection cn = //..
// Very important - JDBC default is to commit after every statement
// which will cause DB to close the cursor
cn.setAutoCommit(false);
Statement st = cn.prepareStatement("SELECT * FROM TBL_FOO");

// Cache 50 rows at the client at a time
st.setFetchSize(50);
ResultSet rs = st.executeQuery();
while (rs.next()) {
    // Move the cursor position forward - moving past cached rows triggers another fetch
}
rs.close();
st.close();

注意,数据库在执行查询时将获取所有行,结果集将占用数据库内存,直到您关闭游标。请记住,数据库是共享资源。