spring - 如何使用 JDK8 功能重写 jdbcTemplate 查询?

标签 spring lambda stream java-8 jdbctemplate

这是代码。假设数据库中有很多大图像,所以我想一次只在内存中保留一个。如何使用 JDK 8 功能(如 lambda 和流)编写此代码?

我开始使用它们,但它一直失败(来自 https://spring.io/guides/gs/relational-data-access/www.jooq.org/java-8-and-sql)并且使用 ResultSetExtractor 是按预期工作的,但是有没有办法在没有 ResultSetExtractor 的情况下做到这一点?

 jdbcTemplate.query( 
            "select id,image,mimetype from images",
            new ResultSetExtractor(){  
                @Override  
                public List extractData(ResultSet rs) throws SQLException, DataAccessException {  
                        while(rs.next()){  
                           createThumbnail( new ImageHolder(rs.getInt("id"), rs.getBytes("image"), rs.getString("mimetype") ));
                        }  
                        return null;
                    }  
            }
    );  

这是一个漂亮的流/lambda 版本,它可以工作,但在内存中保存了太多东西,迟早会出现 OOME。

 jdbcTemplate.query( 
             "select id,image,mimetype from images",
             (rs,rowNum)->new ImageHolder(rs.getInt("id"), rs.getBytes("image"),rs.getString("mimetype"))
    ).stream().forEach(   
                   imageHolder -> createThumbnail(imageHolder)
    ) );

这只是在开始“流式传输”之前加载所有行。

最佳答案

解决方案可能是在第一个 lambda 中移动缩略图的生成,直接翻译您的第一个示例。

jdbcTemplate.query( 
         "select id,image,mimetype from images",
         (rs,rowNum)-> {
             createThumbnail(new ImageHolder(
                rs.getInt("id"),
                rs.getBytes("image"),
                rs.getString("mimetype") ));
         })
)

要具有类似于您尝试实现的结构,查询方法应该返回一个流,这样您就不必在流式传输之前收集所有内容。

关于spring - 如何使用 JDK8 功能重写 jdbcTemplate 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38631198/

相关文章:

java - @Autowired 需要实例化参数的属性

java - Spring创建单例的多个实例?

java - 如何允许基本自动配置类?当我有两个扩展它时,只有第一个被调用

c# - 使用 linq 检查列表计数是否一致

Java为什么 "readAllBytes"和 "readNBytes"方法不同步?

java - Spring 启动: MockMvc returning empty body for POST request

c# - 我如何从字符串创建动态 lambda 表达式?

Python 闭包,默认参数不等于使用 functools.partial 的解决方案?

android - Android 中的直播扩展

flutter - LocalStorage 流未完成?