使用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
相关产品推荐
相关产品推荐

