加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java – 巨大的数据检索

发布时间:2020-12-15 02:24:21 所属栏目:Java 来源:网络整理
导读:我有一个请求,在其中一个报告中,我需要从数据库中获取大约1000万条记录并将它们传输到Excel. 该应用程序是客户端 – 服务器模型,其中服务器端逻辑用EJB和EJB编写.客户端是用Swing编写的. 现在我的问题是当我尝试从Resultset填充Java的对象时,如果结果集的大
我有一个请求,在其中一个报告中,我需要从数据库中获取大约1000万条记录并将它们传输到Excel.

该应用程序是客户端 – 服务器模型,其中服务器端逻辑用EJB和EJB编写.客户端是用Swing编写的.

现在我的问题是当我尝试从Resultset填充Java的对象时,如果结果集的大小更多(>> 100000)那么它会在Java端抛出Out of Memory Error.

有人能告诉我这个风景应该如何处理Java?我需要将所有记录从服务器传输到客户端,然后我需要根据从服务器端检索的数据构建Excel报告.

解决方法

我会使用LIMIT命令将结果集分解为更小的块(mySQL,不知道这是否在其他数据库服务器中).像这样的伪代码:

long recsToget = 50000;
long got = recsToGet;
long offset = 0;
while ( got == recsToGet )
{
  got = getNextBatchFromDb( offset );
  writeBatchToCsv();
  offset += recsToGet; //increase your OFFSET each time
}

我会在getNextBatchFromDb()函数中的SQL查询中使用LIMIT和OFFSET,如下所示:

select * from yourtable LIMIT 50000 OFFSET 100000

OFFSET是开始读取的位置,LIMIT是要读取的数字.

通过这样做,您可以在较小的块中读取大数据集并每次更新CSV直到完成.您知道当getNextBatchFromDb()返回小于recsToGet的行数时,已读取所有记录.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读