Есть ли ограничение на время получения cfquery с cfqueryparam? - PullRequest
2 голосов
/ 20 августа 2011

У меня есть код, который выполняет жесткий цикл для вставки тысяч + записей, и недавно, когда я представляю <cfqueryparam>, происходит сбой 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>

Используетсяработать красиво без <cfqueryparam>.Однако, с помощью cfqueryparam, я думаю, это может быть проблематично, если количество записей qBars велико (10000 +).

Теперь ... Что мне делать?Рефакторинг все это будет обрабатываться на уровне БД?

Спасибо

Ответы [ 4 ]

8 голосов
/ 20 августа 2011

Если честно, если бы мне нужно было загружать записи 10k + в БД, я бы не использовал CFQUERY.Ваша БД почти наверняка будет иметь возможность массовой загрузки данных, поэтому я рекомендую изучить это.

Я думаю, что максимально допустимое количество параметров связывания будет ограничением, установленным механизмом БД, а не CF или лежащим в основеJDBC.Но вы не упоминаете, какую БД вы используете, поэтому там сложно найти для вас ответ.

Я немного покопался и нашел эту таблицу для SQL Server: http://msdn.microsoft.com/en-us/library/ms143432.aspx. Этоконкретно не упоминается, сколько параметров связывания может иметь встроенный запрос, но цифра 2100, которую они упоминают для параметров для процедуры или функции, совпадает с максимальным количеством параметров, которые я смог передать в списке ранее (например,для предложения WHERE IN).Я всегда думал, что это максимальный размер для списка, но, возможно, на самом деле это ограничение на количество параметров в общем.Это было бы легко для вас проверить ... попробуйте ваш цикл с 1005 итерациями и посмотрите, работает ли он.Затем попробуйте сделать это с 1006 итерациями, и я могу ожидать, что это не получится.

То есть, конечно, если вы оказались на SQL Server ...

Кроме того, вы говорите, что вещьвылетает, но вы не говорите, в чем заключается ошибка ... всегда полезно включать такую ​​информацию, когда вы задаете такой вопрос.

2 голосов
/ 21 августа 2011

Вы также можете попробовать:

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>

Я думаю, это сработает. Я не пробовал это в последнее время, но я уверен, что использовал это в прошлом. Я изменил этот пример для другого ответа SO.

2 голосов
/ 20 августа 2011

Я бы изменил код на

<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>

И посмотрим, что получится.Если это работает, вы можете обернуть

2 голосов
/ 20 августа 2011

У Антония есть хорошее предложение ... Я бы проверил, какое влияние это окажет на вашу проблему.Лично я бы склонялся к рефакторингу.Я добился больших успехов в переводе операций с данными на уровень базы данных.

В настоящее время я отвечаю за приложение, которое анализирует и анализирует ключевые слова.Первоначально синтаксический анализатор был написан на Coldfusion, который отлично работал.Поскольку объем записей для обработки рос (почти экспоненциально), сам процесс стал очень медленным.Я переписал код в t-SQL (я использую SS2K8), и время отклика значительно увеличилось.Имхо, рефакторинг стоит времени, особенно в отношении операций с большими объемами данных.

...