Coldfusion 使用cfqueryparam的cfquery可以使用多长时间有限制吗?
我有一些代码做了一个紧密的循环来插入数千条以上的记录,最近当我引入Coldfusion 使用cfqueryparam的cfquery可以使用多长时间有限制吗?,coldfusion,Coldfusion,我有一些代码做了一个紧密的循环来插入数千条以上的记录,最近当我引入时,CF崩溃了 类似于 <cfquery> <cfloop query="qBars"> INSERT INTO Foo SET xx = <cfqueryparam value="#qBars.aa#" sqltype="CF_SQL_VARCHAR">, yy = <cfqueryparam value="#qBars.bb#" sqlt
时,CF崩溃了
类似于
<cfquery>
<cfloop query="qBars">
INSERT INTO Foo
SET
xx = <cfqueryparam value="#qBars.aa#" sqltype="CF_SQL_VARCHAR">,
yy = <cfqueryparam value="#qBars.bb#" sqltype="CF_SQL_INTEGER">
</cfloop>
</cfquery>
插入到Foo中
设置
xx=,
yy=
在没有
的情况下,这项功能可以很好地工作。然而,对于cfqueryparam,我想当qbar
的记录计数很大(10000+)时,可能会出现问题
现在。。。我该怎么办?重构要在DB级别处理的整个事情
谢谢安东尼有个好建议。。。我想看看这对你的问题有什么影响。就个人而言,我倾向于重构。我在将数据密集型操作转移到数据库级别方面取得了巨大成功
我目前负责一个分析关键字的应用程序。解析器最初是用coldfusion编写的,它非常有效。随着要处理的条目数量的增加(几乎呈指数增长),处理本身变得非常缓慢。我用t-SQL重写了代码(我运行的是SS2K8),响应时间大幅增加。恕我直言,重构是值得的,尤其是在数据密集型操作上。我会将代码更改为
<cfloop query="qBars">
<cfquery>
INSERT INTO Foo
SET
xx = <cfqueryparam value="#qBars.aa#" sqltype="CF_SQL_VARCHAR">,
yy = <cfqueryparam value="#qBars.bb#" sqltype="CF_SQL_INTEGER">
</cfquery>
</cfloop>
插入到Foo中
设置
xx=,
yy=
看看会发生什么。如果这样做有效,你可以包装一个老实说,如果我需要将10k+记录加载到数据库中,我不会使用CFQUERY。您的数据库几乎肯定具有批量加载数据的能力,因此我建议对此进行调查 我认为允许的绑定参数的最大数量是由DB引擎设置的限制,而不是由CF或底层JDBC设置的限制。但是你没有提到你正在使用的数据库,所以很难为你找到答案 我四处窥探,找到了SQL Server的以下表:。它没有特别提到一个内联查询可以有多少个bind参数,但是它们提到的proc或函数的params的2100数字与我之前能够在列表中传递的最大参数数相同(比如WHERE-in子句)。我一直认为这是一个列表的最大大小,但也许它实际上是多少个参数的截止值。这对你来说很容易测试。。。尝试1005次迭代的循环,看看是否有效。然后尝试1006次迭代,我可能认为它会失败 当然,也就是说,如果您碰巧在SQL Server上 另外,你说东西崩溃了,但你没有说错误是什么。。。当你问这类问题时,包含这类信息总是很有帮助的。你也可以尝试:
INSERT INTO ''foo'' (''xx'',''yy'')
VALUES
<cfloop query="qBars">
(<cfqueryparam value="#qBars.aa#" sqltype="CF_SQL_VARCHAR">, <cfqueryparam value="#qBars.bb#" sqltype="CF_SQL_VARCHAR">)
<cfif NOT qBars.currentRecordcount eq qBars.recordcount>,</cfif>
</cfloop>
插入到“foo”(“xx”、“yy”)中
价值观
(, )
,
我想这会管用的。我最近没有试过,但我很肯定我过去用过。我修改了这个示例以获得另一个SO答案。您是否尝试将您的
cfquery
放在cfloop
中,这样您就可以在000次查询中运行一条语句,而不是在一次查询中运行000次语句?谢谢,是的,我使用的是SQL Server,不是,它不会产生任何崩溃/异常信息,但服务器将不再响应任何内容。好主意,我会试试这个。但是,性能会受到很大影响,不是吗?如果它工作,那么性能会比让服务器停止响应要好得多。如果将它们作为一个事务发送,则只有一个提交,只有一个重新索引。因此,我认为这场演出不会很糟糕。我可能错了,我不是DBA。请注意,我相信语法需要ms sql 2008+,除了更干净之外,这种语法在其他方面是否更好?@JasonDean:但这将不允许插入超过1000个值。