Java 分批读取SQL数据库

Java 分批读取SQL数据库,java,sql,sql-server-2008,jdbc,Java,Sql,Sql Server 2008,Jdbc,我正在使用Java从SQL RDBMS读取数据并将结果返回给用户。问题是数据库表有1.55亿行,这使得等待时间非常长 我想知道是否有可能从数据库中检索结果,并将其以增量方式分批呈现给用户 我的查询是一个简单的SELECT*FROM表格名称查询 是否有一种机制或技术可以成批回调DB记录,直到SELECT查询完成 使用的RDBMS是MS SQL Server 2008 提前感谢。使用分页限制pageno,rows/TOP可能会创建孔和重复项,但可能会与检查最后一行ID(其中ID>)结合使用?按id订

我正在使用Java从SQL RDBMS读取数据并将结果返回给用户。问题是数据库表有1.55亿行,这使得等待时间非常长

我想知道是否有可能从数据库中检索结果,并将其以增量方式分批呈现给用户

我的查询是一个简单的SELECT*FROM表格名称查询

是否有一种机制或技术可以成批回调DB记录,直到SELECT查询完成

使用的RDBMS是MS SQL Server 2008

提前感谢。

使用分页限制pageno,rows/TOP可能会创建孔和重复项,但可能会与检查最后一行ID(其中ID>)结合使用?按id订购限制为0,100


您可以使用或只向前获取数据。

这正是JDBC驱动程序应该如何工作的我记得旧PostgreSQL驱动程序中的错误,它导致所有获取的记录都存储在内存中

但是,它允许您在查询开始获取记录时读取记录。这就是我开始搜索的地方

例如,Oracle优化SELECT*查询以获取整个集合。这意味着在第一个结果出现之前可能需要很多时间。您可以为获取第一个结果提供优化提示,这样可以非常快地向用户显示第一行,但整个查询可能需要更长的时间来执行

您应该首先在控制台上测试您的查询,以检查它何时开始获取结果。然后尝试使用JDBC并在迭代ResultSet时监视内存使用情况。如果内存使用量增长很快,请检查是否已在“仅向前”和“只读”模式下打开ResultSet,如有必要,请更新驱动程序

如果这种解决方案由于内存使用而不可行,您仍然可以手动使用游标并在每个查询中获取N行,比如100行

MSSQL的游标文档:例如这里:

方法语句SetFetchSize和语句GetMoreResults应该允许您管理从数据库的增量抓取。不幸的是,这是接口规范,供应商可能实现,也可能不实现。获取期间的内存管理实际上取决于供应商,这就是为什么我不能严格地说JDBC就是这样工作的

从:

setFetchSizeint行

给JDBC驱动程序一个提示,告诉它应该添加的行数 当ResultSet需要更多行时从数据库中获取 由该语句生成的对象

getMoreResults

移动到此语句对象的下一个结果,如果它是 ResultSet对象,并隐式关闭任何当前ResultSet对象 使用getResultSet方法获得

GetMoreResultInt电流

移动到此语句对象的下一个结果,处理任何当前 ResultSet对象根据给定的 如果下一个结果是ResultSet对象,则返回true。 当前参数表示保留或关闭当前结果集

此外,这还回答了有关在SQLServer2005中使用setFetchSize的问题,以及它似乎如何不管理批处理回迁。建议使用2008驱动程序进行测试,或者使用jTDS驱动程序,该驱动程序在评论中获得好评

这可能也很有用,因为它包含指向MSDN上SQLServer驱动程序设置的链接

还有一些关于SQLServer2005的好信息,但与SQLServer2005有关的更多。在我的粗略评论中找不到2008特定版本。无论如何,它建议使用以下内容创建语句:

com.microsoft.sqlserver.jdbc.SQLServerResultSet.TYPE_SS_SERVER_CURSOR_FORWARD_ONLY 2004可滚动性用于仅向前只读访问,然后使用setFetchSize方法调整性能


您是否试图一次将所有1.55亿行返回给最终用户?根据RDBMS,为MySql选择有限的行数,Sql Server使用限制使用上述注释前n+1。用户可以用155m行有意义地做什么?还有,哪个数据库?JDBC支持设置要获取的行数和。不幸的是,这些功能的实现并不一定取决于JDBC供应商@Woot4Moo。事实上,我需要返回所有155m行。我唯一的建议是找到一种在服务器上实现大部分功能的方法。RDBMS是针对此类任务设计的,并有望进行优化。如果它不仅仅是一个查询,那么考虑存储过程。谢谢你的答案。我想MS游标和获取功能应该可以完成这项工作。我将尝试一下,并发布任何结果。