描述
有一个庞大的玩家数据库200.000
,下面是.ftl模型
:
<header> ... <header>
<main>
!Here is the problem
<#list items as vo>
<name> $vo.name} </name>
<surname> ${vo.surname} </surname>
<abilities> ${vo.abilities} </abilites>
</#list>
</main>
<footer> ... </footer>
<小时/>
怎么了?
当我的玩家数量较少时,上面的方法效果很好,比方说 5.000
。
我想做什么?
我需要立即为所有玩家创建此文档,这意味着我必须传递包含 100.000
或更多玩家的列表。这将导致 Java OutOfMemoryException
。
所以我每次都会获取1.000
个玩家并创建列表,但问题是....如何像以前一样传递所有玩家?我有一个 .ftl
模型,而 FreeMarker 不支持类似的东西......
我希望所有 200.000
玩家都在同一个文档中。
我应该使用什么技术:)?
Java 类如下所示:
public FinalXMLVo extends HashMap<String,Object>{
...
private List<Player> players;
public FinalXMLVo(....,List<Player> players){
...
this.put("items",players);
}
...
}
最佳答案
您传递给 FreeMarker 的 Writer
是否缓冲所有输出?也许查看 OutOfMemoryException
通常发生的位置有助于弄清楚这一点。
除此之外,我不知道为什么较长的列表会在 FreeMarker 中消耗更多的内存。至少在您展示的这样一个基本用例中,它应该能够保持渲染,甚至是无限列表。
此外,如果您使用的是 Iterator
而不是 List
,它也会释放数据源的内存(如 ResultSet
也许)足够聪明,不会缓冲所有内容。
关于java - 使用 FreeMarker 流式传输巨大列表,内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56017977/