Java 从数据库中获取数据作为块以节省内存

Java 从数据库中获取数据作为块以节省内存,java,Java,我的问题与JDBC查询有关,在JDBC查询中,表中的记录数量很大。最终目标是以流式方式从数据库中获取数据,通过流式方式逐块获取数据 这可以通过使用关键字(如LIMIT、OFFSET)创建多个SQL语句来实现。但在这种情况下,将有多个DB调用,这将花费更多的时间。 有没有一种方法可以让您不将整个结果集加载到内存中&不需要额外的DB调用就可以获取数据块 首先,如果您从数据库中获取数据块,您将执行多个数据库调用。您将不会执行那么多查询 第二,是的,这是可能的。有一个DB概念称为“游标” 注意,数据库在

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

这可以通过使用关键字(如LIMIT、OFFSET)创建多个SQL语句来实现。但在这种情况下,将有多个DB调用,这将花费更多的时间。 有没有一种方法可以让您不将整个结果集加载到内存中&不需要额外的DB调用就可以获取数据块


首先,如果您从数据库中获取数据块,您将执行多个数据库调用。您将不会执行那么多查询

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


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

在本例中,数据库表如果有10万行,所有行都不会被提取到内存中,一次只提取50行,对吗?其余的数据是通过进一步的Sql查询获得的?我的意思是JDBC驱动程序如何获取其余的数据?我的主要目标是减少应用程序占用的内存。这在这里实现了吗?您的上一条语句暗示所有行都已获取。你能澄清一点吗?是的。在Java中迭代结果集时,数据库将获取所有行。问题是,内存在哪里?您可以限制客户端使用的内存,但这意味着服务器必须在客户端完成之前将所有行保留在内存中。这是否意味着您正在减少应用程序使用的内存?那要看你的意思了,我明白。但最初执行查询时,如果设置fetchSize,则仅检索块。但是,当您将resultset作为一个函数进行迭代时,当fetchsize超过时,将提取新的块。对于我的场景来说,这听起来不错,因为不是一次获取所有数据。
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();