在编写解决下载具有低 RAM 影响的巨大动态 zip问题的解决方案时,一个想法开始困扰我,并导致了这个问题,要求纯粹的好奇心/对知识的渴望:
如果不是InputStream
一次加载一个 s (对数据库进行单独的查询),我会InputStream
在一个查询中加载所有 s ,返回一个列表(n,可能是数千个,“打开”)InputStreams
?
当前(安全)版本:n 个查询,一次实例化一个inputStream
for (long id : ids){
InputStream in = getMyService().loadStreamById(id);
IOUtils.copyStream(in, out);
in.close();
}
假设版本:一个查询,n 个实例化的 inputStreams
List<InputStream> streams = getMyService().loadAllStreams();
for (InputStream in : streams){
IOUtils.copyStream(in, out);
in.close();
in = null;
}
第二种方法的优缺点是什么,不包括(我想很少)用于保持多个 java InputStream 实例化的内存量?
它是否会导致某种网络冻结或数据库压力(或锁定,或者如果其他人读/写 Stream 指向的相同 BLOB 字段等问题...)超过多个查询?
或者他们是否足够聪明以至于在被要求提供数据之前几乎是隐形的,然后1 query + 1000 active stream
可能比1000 query + 1 active stream
?