我有一个循环查询的函数,并为每个项更新数据库行。在大约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>
答案 0 :(得分:3)
不要在每次修复fixItems查询时使用cfinvoke创建Item组件。使用createObject在此之前创建一次,并且每次直接在对象上调用updateCode方法。
答案 1 :(得分:1)
可以做到以下几点:
将<cfqueryparam>
更改为使用相应的cf_sql
类型。 code
和id
真的是字符串吗?
不要给你<cfquery>
一个名字。无论如何你都没有保留结果。 <{p>
var loc
将内存提升到JVM Addtional方法使用Java 7和G1GC
每100至1000次迭代执行强制垃圾收集
批量更新您的数据。基于XML的表变量可以做到这一点。
让您的功能保持沉默
在此