说明
有一个庞大的玩家数据库200.000
,下面是.ftl model
:
<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);
}
...
}
答案 0 :(得分:1)
您将Writer
传递给FreeMarker缓冲所有输出吗?也许看看OutOfMemoryException
通常在哪里出现,有助于弄清楚这一点。
除此之外,我不知道为什么更长的列表会在FreeMarker中消耗更多的内存。至少在您展示的这种基本用例中,它甚至应能够保持渲染无限列表。
此外,如果您使用的是List
而不是Iterator
,那么只要数据源(例如ResultSet
)足够聪明,它也可以释放内存。不能全部缓冲。