【发布时间】:2018-07-09 16:43:30
【问题描述】:
我有一个 ColdFusion 脚本,它执行一项任务,然后使用 <cflocation> 标记重定向到自身,并传入下一个要处理的 ID。该脚本在正好 51 行后停止工作。我认为这是代码中的错误,所以我将要处理的 ID 更新为 52,它从 ID 52 运行到 102 并停止。同样,正好是 51 行。
有谁知道ColdFusion 中cflocation 标签是否有限制?或者这可能是 IIS 正在做的事情?
当我使用 JavaScript window.location 方法时,它可以正常工作并且直到最后才停止 - 正如预期的那样。
更新 - 说明
处理每个 ID 后脚本重定向到自身的原因是因为 ColdFusion 直到请求完成后才会将变量/内存释放回 JVM。因此,对于执行数百个复杂任务的请求,内存使用量会持续增长,直到请求正式完成。这会导致 JVM 中出现 ERROR OUT OF MEMORY。据我了解,纠正此问题的最佳方法是将项目拆分为单独的请求,这样 ColdFusion 会将请求变量/内存释放回 JVM。因此,为什么我们要处理 1 个项目,然后重定向到自我传递下一个要处理的 ID。这是为了让 ColdFusion 将请求视为唯一并降低内存消耗。
【问题讨论】:
-
这听起来像是XY Problem。与其问如何解决您尝试的解决方案,不如告诉我们您通过多次重定向尝试解决的实际问题是什么?
-
@Miguel-F - 更新了我的问题以显示更多细节
-
我假设通过传递您正在更新或以某种方式处理数据库中记录的 ID?为什么要在内存中存储这么多东西?你能在每次迭代中重复使用相同的结构吗?你不能删除每次迭代之间的结构吗?使用
StructDelete()的AFAIK 将破坏对这些变量的引用,从而释放GC 的内存空间。即使你通过了这个重定向限制,我猜你接下来会开始遇到请求超时问题。 -
我同意@Miguel-F 的观点。这似乎是一项可以以更好的方式完成的大量工作。如果您的进程在内存不足的情况下运行 JVM,则该进程的工作方式可能存在问题。我还将研究 Leeish 提出的使用排队机制来处理这些记录的建议。但如果可以将这些过程批处理而不是循环它们,那就更好了。
-
你在每次迭代中运行什么样的“数百个复杂任务”?
标签: iis coldfusion iis-8 coldfusion-10