读完后本文 https://www.airpair.com/java/posts/spring-streams-memory-efficiency,我希望使用 Spring 将数据库查询结果直接流式传输到 JSON 响应,以确保恒定的内存使用量(不会贪婪地加载List
在记忆中)。
与 Hibernate 文章中所做的类似,我组装了一个greetingRepository
对象返回基于数据库内容的流JdbcTemplate
。在该实现中,我在查询上创建了一个迭代器ResultSet
,我按如下方式返回流:
return StreamSupport.stream(spliterator(), false).onClose(() -> {
log.info("Closing ResultSetIterator stream");
JdbcUtils.closeResultSet(resultSet);
});
即与onClose()
方法保证底层ResultSet
如果流在 a 中声明,则将被关闭try-with-resources
构造:
try(Stream<Greeting> stream = greetingRepository.stream()) {
// operate on the stream
} // ResultSet underlying the stream will be guaranteed to be closed
但正如本文中所述,我希望该流由自定义对象映射器(增强型MappingJackson2HttpMessageConverter
文章中定义)。如果我们采取try-with-resources
撇开需要不谈,这是可行的,如下:
@RequestMapping(method = GET)
Stream<GreetingResource> stream() {
return greetingRepository.stream().map(GreetingResource::new);
}
然而,正如一位同事在那篇文章底部评论的那样,这并没有考虑关闭底层资源。
在 Spring MVC 的上下文中,如何从数据库一直流式传输到 JSON 响应,并且仍然保证ResultSet
将被关闭?您能提供一个具体的示例解决方案吗?