gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:42:40 27 4
gpt4 key购买 nike

这是代码。假设数据库中有很多大图像,所以我想一次只在内存中保留一个。如何使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com