Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从数据库中检索顺序数据的最快方法是什么?_Java_Sql_Database_Postgresql_Sequential - Fatal编程技术网

Java 从数据库中检索顺序数据的最快方法是什么?

Java 从数据库中检索顺序数据的最快方法是什么?,java,sql,database,postgresql,sequential,Java,Sql,Database,Postgresql,Sequential,我在数据库中有很多行,必须对其进行处理,但由于内存限制,我无法将所有数据检索到内存中 目前,我使用LIMIT和OFFSET来检索数据,以获得特定时间间隔内的数据 我想知道这是从数据库中的表中获取所有数据的更快的方法还是其他方法。将不应用任何筛选器,所有行都将被处理 SELECT * FROM table ORDER BY column 没有理由把整张桌子都塞进RAM里。只需打开一个光标并开始阅读。您可以使用fetch大小之类的东西来玩游戏,但是在您处理行时,DB会很高兴地保持它的位置 增编:

我在数据库中有很多行,必须对其进行处理,但由于内存限制,我无法将所有数据检索到内存中

目前,我使用LIMIT和OFFSET来检索数据,以获得特定时间间隔内的数据

我想知道这是从数据库中的表中获取所有数据的更快的方法还是其他方法。将不应用任何筛选器,所有行都将被处理

SELECT * FROM table ORDER BY column
没有理由把整张桌子都塞进RAM里。只需打开一个光标并开始阅读。您可以使用fetch大小之类的东西来玩游戏,但是在您处理行时,DB会很高兴地保持它的位置

增编:

好的,如果您使用的是Java,那么我很清楚您的问题是什么

首先,只需使用Java,就可以使用游标。这基本上就是Java中的结果集。有些结果集比其他结果集更灵活,但其中99%是简单的、仅向前的结果集,您可以调用“下一步”来获取每一行

至于你的问题

问题特别在于Postgres JDBC驱动程序。我不知道他们为什么这样做,也许是规范,也许是其他原因,但不管怎样,Postgres有一个奇怪的特性,即如果您的连接的autoCommit设置为true,那么Postgres决定在execute方法或first-next方法上吸取整个结果集。在哪里并不重要,只是如果你有无数行,你会得到一个很好的OOM例外。没有帮助

这很容易就是你所看到的,我理解这是多么令人沮丧和困惑

Most连接默认为自动提交=真。相反,只需将autoCommit设置为false

Connection con = ...get Connection...
con.setAutoCommit(false);
PreparedStatement ps = con.prepareStatement("SELECT * FROM table ORDER BY columm");
ResultSet rs = ps.executeQuery();
while(rs.next()) {
    String col1 = rs.getString(1);
    ...and away you go here...
}
rs.close();
ps.close();
con.close();
请注意明显缺乏异常处理,留给读者作为练习

如果希望对一次提取到内存中的行数进行更多控制,可以使用:

ps.setFetchSize(numberOfRowsToFetch);
玩这些游戏可能会提高你的表现

如果您关心排序,请确保在ORDER BY中使用的列上有适当的索引

没有理由把整张桌子都塞进RAM里。只需打开一个光标并开始阅读。您可以使用fetch大小之类的东西来玩游戏,但是在您处理行时,DB会很高兴地保持它的位置

增编:

好的,如果您使用的是Java,那么我很清楚您的问题是什么

首先,只需使用Java,就可以使用游标。这基本上就是Java中的结果集。有些结果集比其他结果集更灵活,但其中99%是简单的、仅向前的结果集,您可以调用“下一步”来获取每一行

至于你的问题

问题特别在于Postgres JDBC驱动程序。我不知道他们为什么这样做,也许是规范,也许是其他原因,但不管怎样,Postgres有一个奇怪的特性,即如果您的连接的autoCommit设置为true,那么Postgres决定在execute方法或first-next方法上吸取整个结果集。在哪里并不重要,只是如果你有无数行,你会得到一个很好的OOM例外。没有帮助

这很容易就是你所看到的,我理解这是多么令人沮丧和困惑

Most连接默认为自动提交=真。相反,只需将autoCommit设置为false

Connection con = ...get Connection...
con.setAutoCommit(false);
PreparedStatement ps = con.prepareStatement("SELECT * FROM table ORDER BY columm");
ResultSet rs = ps.executeQuery();
while(rs.next()) {
    String col1 = rs.getString(1);
    ...and away you go here...
}
rs.close();
ps.close();
con.close();
请注意明显缺乏异常处理,留给读者作为练习

如果希望对一次提取到内存中的行数进行更多控制,可以使用:

ps.setFetchSize(numberOfRowsToFetch);
玩这些游戏可能会提高你的表现


如果您关心排序,请确保您在ORDER BY中使用的列上有一个适当的索引。

因为根据您的评论使用Java是明确的:

如果您使用的是JDBC,则需要使用:

如果您使用的是Hibernate,它会变得更加棘手:

由于根据您的评论明确您使用Java:

如果您使用的是JDBC,则需要使用:

如果您使用的是Hibernate,它会变得更加棘手:

我可以将光标检索到Java并获取数据吗?请查看我的答案。下次在问题中加入这些细节(比如编程语言)。这样,@Will可以给你一个更好的答案。谢谢你和@Adam。这两个答案有助于解决这个问题,但我仍然有一个疑问。在语句或resultset中设置fetch大小有什么区别?没有区别,语句中的大小只是从该语句创建的所有resultset的默认值。我可以将光标检索到Java并获取数据吗?请查看我的答案。下次在问题中加入这些细节(比如编程语言)。这样,@Will可以给你一个更好的答案。谢谢你和@Adam。这两个答案有助于解决这个问题,但我仍然有一个疑问。在语句或resultset中设置fetch大小有什么区别?没有区别,语句中的fetch大小只是从该语句创建的所有resultset的默认值。