Coldfusion OutOfMemory错误(CF9/Wheels)

Coldfusion OutOfMemory错误(CF9/Wheels),coldfusion,coldfusion-9,cfwheels,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"

我有一个函数,可以循环查询并更新每个项目的数据库行。在大约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>

更新项目
设置代码=
其中id=

可以执行以下操作:

  • 更改您的
    以使用适当的
    cf\u sql
    类型。
    code
    id
    真的是字符串吗

  • 不要给你的
    起名字。无论如何,您都不会保留结果<代码>var loc也没有帮助

  • 使用Java 7和G1GC将内存增加到JVM附加方法

  • 每100到1000次迭代执行一次强制垃圾收集

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

  • 使你的函数保持沉默

  • 考虑一下这个问题


  • 可以做到以下几点:

  • 更改您的
    以使用适当的
    cf\u sql
    类型。
    code
    id
    真的是字符串吗

  • 不要给你的
    起名字。无论如何,您都不会保留结果<代码>var loc也没有帮助

  • 使用Java 7和G1GC将内存增加到JVM附加方法

  • 每100到1000次迭代执行一次强制垃圾收集

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

  • 使你的函数保持沉默

  • 考虑一下这个问题


  • 不要在fixItems查询的每次迭代中使用cfinvoke创建项目组件。在此之前使用createObject创建一次,每次直接在对象上调用updateCode方法。

    不要在每次迭代fixItems查询时使用cfinvoke创建项目组件。在此之前使用createObject创建一次,每次直接在对象上调用updateCode方法即可。

    如果可能的话,您不应该为此使用CF。RE:在查询中循环并更新每个项目的数据库行。查询的来源是什么?您可能想考虑一下解决方案:如果可能的话,您不应该为此使用CF。Re:在查询中循环并更新每个项目的数据库行,查询的来源是什么?您可能需要考虑以下的解决方案:如果可能,在db中执行批量操作将比7K db调用要好得多。这个“查询”的来源是什么?即使它确实起作用,它基本上是一个创可贴。最好看看各种建议,或者找到一个o/h更少的替代方案(db内的批量操作)。如果做不到这一点,试着减少影响(,等等)。。如果可能,在db中执行批量操作将比7K db调用要好得多。这个“查询”的来源是什么?即使它确实起作用,它基本上是一个创可贴。最好看看各种建议,或者找到一个o/h更少的替代方案(db内的批量操作)。如果做不到这一点,试着减少影响(,等等)。这是我要做的第一件事<代码>和
    CreateObject()
    速度很慢。其他答案中的建议也很好。这是我要尝试的第一件事<代码>和
    CreateObject()
    速度很慢。其他答案中的建议也很好。