You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Freemarker递归宏遍历大量记录时出现StackOverflow错误

解决Freemarker递归宏遍历大量记录导致的StackOverflow错误

嘿,这个问题我之前也踩过坑!递归宏写起来确实简洁,但用来处理上千条记录绝对会触发栈溢出——毕竟每一次递归调用都会把当前的上下文压进调用栈,次数堆到1000次时,栈内存直接就不够用了。

咱们先捋清楚问题根源:你的递归宏每处理一条记录就会调用自身一次,当迭代到第1000条时,调用栈里已经堆了1000个宏的执行上下文,直接触发StackOverflow错误。

替代方案:用循环代替递归

Freemarker的循环结构是迭代式执行的,不会不断压栈,完全适合处理大量数据。这里给你两种靠谱的实现方式:

方案1:直接用<#list>遍历迭代器

这是最简洁的方式,Freemarker的<#list>可以直接迭代EntityQuery返回的迭代器:

<#assign eli = EntityQuery.use(delegator).from("Person").where(...).queryIterator()/>
<#list eli as item>
    ${item.partyId!} ${item.firstName!} ${item.lastName!}
</#list>

方案2:手动实现while循环

如果因为某些场景不能用<#list>,可以用<#assign>和<#while>组合手动迭代:

<#assign eli = EntityQuery.use(delegator).from("Person").where(...).queryIterator()/>
<#assign currentItem = eli.next()/>
<#while currentItem?has_content>
    ${currentItem.partyId!} ${currentItem.firstName!} ${currentItem.lastName!}
    <#assign currentItem = eli.next()/>
</#while>

额外提示

如果是用Apache OFBiz这类框架,迭代器一般会在请求结束后自动关闭,但如果需要手动释放资源,可以在循环结束后加上:

<#assign dummy = eli.close()/>

内容的提问来源于stack exchange,提问作者Sonal Patwari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:42:47