使用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或其他数据库引擎,则查询看起来会有所不同。