Плохо ли использовать cfquery внутри cfloop?
У меня есть массив структур. Мне нужно вставить все строки из этого массива в таблицу. Так что я просто использовал cfquery
внутри cfloop
вставить в базу данных.
Некоторые люди предлагали мне не использовать cfquery внутри cfloop, так как каждый раз он устанавливает новое соединение с базой данных.
Но в моем случае есть ли способ сделать это без использования cfloop внутри cfquery?
4 ответа
Речь идет не столько о поддержании соединений, сколько о попадании на сервер 'n' запросов на вставку или обновление данных для каждой итерации в cfloop. Это будет выглядеть нормально при тестировании нескольких записей, но затем, когда вы запускаете его в производство, и ваш клиент подталкивает ваше приложение к просмотру пары сотен строк, то вы попадете на сервер базы данных пару сотен раз как Что ж.
Как предполагает Скотт, вам следует подумать о циклическом построении одного запроса, а не нескольких обращений к базе данных. Циклы внутри cfquery имеют то преимущество, что вы можете использовать cfqueryparam, но если вы можете доверять данным, т.е. он уже обработан, возможно, вам будет проще использовать что-то вроде cfsavecontent для построения вашего запроса и вывода строки внутри cfquery в конце.
Я использовал как запрос внутри цикла, так и цикл внутри метода запроса. Хотя цикл внутри запроса теоретически быстрее, это не всегда так. Вы должны попробовать каждый метод и посмотреть, что лучше всего работает в вашей ситуации.
Вот синтаксис для цикла внутри запроса, используя оракул для выбора базы данных.
insert into table
(field1, field2, etc)
select null, null, etc
from dual
where 1 = 2
<cfloop>
union
select <cfqueryparam value="#value1#">
, <cfqueryparam value="#value2#">
etc
from dual
</cfloop>
Существует ограничение на количество <CFQUERY><cfloop>
... итерации, которые вы можете сделать при использовании <cfqueryparam>
, Это также зависит от поставщика. Если вы не знаете, сколько записей вы будете генерировать, лучше всего удалить <cfqueryparam>
, если это безопасно. Убедитесь, что ваши данные поступают из надежных источников и очищены. Такой подход может сэкономить огромное количество времени на обработку, потому что в отличие от внешнего цикла он выполняет только один вызов на сервер базы данных.
В зависимости от базы данных, преобразуйте ваш массив структур в XML, а затем передайте его как отдельный параметр хранимой процедуре.
В хранимой процедуре выполните INSERT INTO SELECT, где инструкция SELECT выбирает данные из пакета XML. Таким способом вы можете вставить сотни или тысячи записей с помощью одного оператора INSERT.