Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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 使用JdbcTemplate从数据库读取大数据并通过api公开?_Java_Spring Boot_Rest_Spring Mvc_Spring Webflux - Fatal编程技术网

Java 使用JdbcTemplate从数据库读取大数据并通过api公开?

Java 使用JdbcTemplate从数据库读取大数据并通过api公开?,java,spring-boot,rest,spring-mvc,spring-webflux,Java,Spring Boot,Rest,Spring Mvc,Spring Webflux,我需要从postgres数据库读取一个大数据集,该数据库需要通过RESTAPI端点访问。然后,使用数据的客户端需要将数据转换为csv格式(以后可能需要支持json和xml) 在服务器端,我们使用SpringBootV2.1.6.RELEASE和SpringJDBCV5.1.8.RELEASE。 我尝试使用分页和循环遍历所有页面,并将结果存储到列表中并返回列表,但由于数据集不适合内存,导致OutOfMemory错误 流式传输大数据集看起来是处理内存限制的好方法。 有没有任何方法可以让我只返回所有数

我需要从postgres数据库读取一个大数据集,该数据库需要通过RESTAPI端点访问。然后,使用数据的客户端需要将数据转换为csv格式(以后可能需要支持json和xml)

在服务器端,我们使用SpringBootV2.1.6.RELEASE和SpringJDBCV5.1.8.RELEASE。
我尝试使用分页和循环遍历所有页面,并将结果存储到列表中并返回列表,但由于数据集不适合内存,导致
OutOfMemory
错误

流式传输大数据集看起来是处理内存限制的好方法。 有没有任何方法可以让我只返回所有数据库实体的流,并且让RESTAPI将相同的返回给客户机?客户端将如何反序列化此流


除此之外还有其他选择吗?

如果您的数据太大,无法放入内存(我认为是千兆字节或更多),那么它可能太大,无法合理地作为单个HTTP响应提供。您将保持连接打开很长时间。如果您中途遇到问题,客户机将需要从头开始,可能是几分钟前

更为用户友好的API将引入分页。调用者可以指定页面大小和要获取的页面索引,作为其请求的一部分

比如说

 /my-api/some-collection?size=100&page=50
这表示从第5000个(5000-5100)开始获取100个项目


也许您可以根据一次可以加载到内存中的内容,对页面大小设置一些合理的限制。

如果您的数据太大,无法放入内存(我认为是千兆字节或更多),那么它可能太大,无法合理地作为单个HTTP响应提供。您将保持连接打开很长时间。如果您中途遇到问题,客户机将需要从头开始,可能是几分钟前

更为用户友好的API将引入分页。调用者可以指定页面大小和要获取的页面索引,作为其请求的一部分

比如说

 /my-api/some-collection?size=100&page=50
这表示从第5000个(5000-5100)开始获取100个项目


也许您可以根据一次可以加载到内存中的内容对页面大小设置一些合理的限制。

这可以通过webflux和反应式数据库实现。您是否将webflux用于反应流?您的数据库是什么?该数据库是postgres,并使用spring jdbc v5.1.8的
NamedParameterJdbcTemplate
查询数据库。我研究了反应型数据库的r2dbc postgresql,但它还不是GA。这可以通过webflux和反应型数据库实现。您是否将webflux用于反应流?您的数据库是什么?该数据库是postgres,并使用spring jdbc v5.1.8的
NamedParameterJdbcTemplate
查询数据库。我研究了反应式数据库的r2dbc postgresql,但它还不是GA。我最终使用分页调用rest客户端,并使用
StreamingResponseBody
写入数据。谢谢你的建议。@mosranna当然,很乐意帮忙,我最终使用分页调用rest客户端,并使用
StreamingResponseBody
写入数据。谢谢你的建议。@mosranna当然,很乐意帮忙