чтение excel и вставка в базу данных

я использую следующий код для обработки вставок: но это занимает слишком много времени, как я могу улучшить его или ускорить работу:

<cfspreadsheet action="read" excludeheaderrow="yes" headerrow="1" rows="2-65536" query="mySheet" src="#dest#\#newfile#" sheet="1">
      <cftry> 
      <cfquery datasource="#request.dsn#" name="myInsert">
      <cfoutput>
      <cfloop query="mySheet">
        INSERT INTO mytable(memberID,lastname,firstname,pid,pname,gender,dob,workphone,homephone,address1,address2,city,county,state,zip,marketValue) 
        values('#mySheet.mem_id##RandRange(1,100)#','#mySheet.MEM_LAST_NAME#','#mySheet.MEM_FIRST_NAME#','#mySheet.PCP_ID#','#mySheet.pcp_name#','#mySheet.gender#','#mySheet.dob#','#mySheet.WORKTELEPHONENUMBER#','#mySheet.HOMETELEPHONENUMBER#','#mySheet.ADDRESSLINE1#','#mySheet.ADDRESSLINE2#','#mySheet.CITY#','#mySheet.COUNTY#','#mySheet.state#','#mySheet.zip#','#mySheet.GROUPNAME#')
      </cfloop>
      </cfoutput>
       </cfquery>

записей в листе excel более 50000


person Regual    schedule 28.06.2013    source источник
comment
больше 50000? Я предполагаю, что их 65536...   -  person duncan    schedule 28.06.2013
comment
Что-нибудь еще происходит в запросе страницы после вставки данных?   -  person Dan Bracuk    schedule 28.06.2013
comment
да, он отображает общее количество вставленных записей и строит журнал для неудачных   -  person Regual    schedule 28.06.2013
comment
Что ж, обновите здесь, решено с помощью утилиты POI, но интересно, не должна ли Cfspreadsheet быть быстрее, чем утилита Custom POI Бена Наделя.   -  person Regual    schedule 28.06.2013
comment
Это не имеет ничего общего с вашим вопросом, но .. 1) randRange не обязательно будет уникальным. Если вы используете его, чтобы убедиться, что memberID является уникальным значением, это не лучший выбор. 2) Вы обязательно должны использовать cfqueryparam. Одним из его преимуществ является повышение производительности при выполнении одного и того же оператора sql в цикле.   -  person Leigh    schedule 28.06.2013
comment
Итак, использование cfquery могло бы работать так же, если бы я не использовал цикл, если это так, я сделаю это прямо сейчас и опубликую результаты времени, которое потребовалось для реализации обеих вещей: Если RandRange не является хорошим выбор, тогда что CreateUUID или GenerateSecretKey или что-то еще, я хотел бы изучить больше об этом: Еще одна вещь: [Не поймите меня неправильно] Один из моих коллег сказал мне, что использование чрезмерного cfqueryparam замедляет обработку, это правда?   -  person Regual    schedule 02.07.2013
comment
Самый простой вариант — столбец идентификаторов. Пусть БД делает работу. (Не используйте generateSecretKey. Он предназначен для другой цели). RE: чрезмерное количество cfqueryparam замедляет обработку Нет. Обычно это повышает производительность за счет использования переменных связывания. Однако есть несколько экзотических случаев, когда его использование может снизить производительность: hashes" title="медленный запрос с поиском cfqueryparam в индексированном столбце, содержащем хеши"> stackoverflow.com/questions/10543755/ * stackoverflow.com/questions/17574276/   -  person Leigh    schedule 22.07.2013
comment
Спасибо @leigh за уточнение ‹cfqueryparam   -  person Regual    schedule 23.07.2013


Ответы (1)


Вот один из способов справиться с этим:

  • Поместите все (cfspreadsheet и все вставки) в потоковое, чтобы он мог работать в фоновом режиме
  • Сохраните запрос электронной таблицы (загрузите результаты) в переменную сеанса.
  • После завершения загрузки выполняйте запросы на вставку партиями; в каждом пакете добавляйте любые проблемы в массив обратной связи, который также находится в области сеанса
  • На стороне пользователя есть страница, которая сообщает пользователю, что все «работает ...», и повторно загружает и отображает проблемы с обратной связью по мере их появления (лучше всего делать с ajax)
person Luke    schedule 06.08.2013