【发布时间】:2013-05-20 07:15:39
【问题描述】:
在将the solution 编码为downloading a huge dynamic zip with low RAM impact 的问题时,一个想法开始困扰我,并导致了这个问题,要求纯粹的好奇心/对知识的渴望:
如果不是一次加载一个InputStreams(对数据库有单独的查询),我会在一个查询中加载所有InputStreams,我会遇到什么样的缺点,返回一个列表(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 更好?
【问题讨论】:
-
Too many file opens怎么样。 -
@Paul Vargas,这会很奇怪,因为这里不涉及文件 :)
标签: java database memory-management inputstream