Coldfusion OutOfMemoryError(CF9 /车轮)

时间:2013-11-15 14:41:16

标签: coldfusion coldfusion-9 cfwheels

我有一个循环查询的函数,并为每个项更新数据库行。在大约7000次迭代之后,它会抛出一个内存不足错误 - Java堆空间。 这段代码有什么明显的错误吗?

<cfloop query=loc.fixItems>
    <cfset loc.count = loc.count + 1>
    <cfset var categoryName = loc.fixItems.categoryName>
    <cfinvoke component="Item" method="updateCode"
        itemId="#loc.fixItems.itemId#" code="#loc.fixItems.newCode#"/>

    <!--- Increment counter for category --->

    <cfif structKeyExists(categoryMap, categoryName)>
        <cfset var inc = structFind(categoryMap, categoryName) + 1>
        <cfset structUpdate(categoryMap, categoryName, inc)>    
    <cfelse>
        <cfset structInsert(categoryMap, categoryName, 1)>  
    </cfif>
</cfloop>

并在更新组件中:

<cffunction name="updateCode">
    <cfargument name="itemId" type="numeric" required="yes">
    <cfargument name="code" type="string" required="yes">

    <cfset var loc = {}>
    <cfquery name="loc.update">
        update items
        set code = <cfqueryparam value="#code#">
        where id = <cfqueryparam value="#itemId#">
    </cfquery>
</cffunction>

2 个答案:

答案 0 :(得分:3)

不要在每次修复fixItems查询时使用cfinvoke创建Item组件。使用createObject在此之前创建一次,并且每次直接在对象上调用updateCode方法。

答案 1 :(得分:1)

可以做到以下几点:

  1. <cfqueryparam>更改为使用相应的cf_sql类型。 codeid真的是字符串吗?

  2. 不要给你<cfquery>一个名字。无论如何你都没有保留结果。 <{p>

  3. 无效var loc
  4. 将内存提升到JVM Addtional方法使用Java 7和G1GC

  5. 每100至1000次迭代执行强制垃圾收集

  6. 批量更新您的数据。基于XML的表变量可以做到这一点。

  7. 让您的功能保持沉默

  8. 在此

  9. 上考虑ORM