Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coldfusion 使用cfqueryparam的cfquery可以使用多长时间有限制吗?_Coldfusion - Fatal编程技术网

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个值。