使用CFWheels将大量记录保存到数据库时,我遇到了问题。这是一个例子:

<cfloop from="1" to="10000" index="i">
 <cfset var newUser = model("user").new()>
 <cfset newUser.name = "Test"&i>
 <cfset newUser.save()>
</cfloop>

这会导致java.lang.OutOfMemoryError

请帮我如何解决这个问题。

最佳答案

这里发生了一些相当低效的事情。首先,它会生成1,000个user对象,在ColdFusion中的单个请求中并不是一个好主意。其次,它正在运行1,000个数据库查询,这在任何编程语言中都不是一个好主意。

在这种情况下,我将停止使用模型对象,并弄清楚如何将逻辑压缩为单个数据库查询。 Wheels中的ORM内容通常非常有用,但是在这种情况下有其局限性。

例如,如果您使用的是SQL Server 2008,则可以在user模型中执行此操作,以使所有内容都在对cfquery的一次调用中:

<cffunction name="batchCreate">
    <cfquery datasource="#get('dataSourceName')#">
        INSERT INTO
            #this.tableName()# (#this.columnNameForProperty("name")#)
        VALUES
            <cfloop from="1" to="10000" index="i">
                (<cfqueryparam cfsqltype="cf_sql_varchar" value="Test#i#">)
                <cfif i lt 10000>,</cfif>
            </cfloop>
    </cfquery>
</cffunction>

当然,如果您使用的是MySQL或其他数据库引擎,则查询看起来会有所不同。

10-07 23:53