Типа декларация. Задача 1

добавлено: 02 дек 10
понравилось:0
просмотров: 1750
комментов: 3

теги:

Автор: Павел Воронцов

Добрый день, коллеги!

В этом блоге я планирую писать о практических задачах, возникавших и возникающих во время разработки разных систем. Задачи в основном будут касаться тем или иным боком баз данных. Также хочется привести в порядок свои мысли о теории БД, реляционной теории и перспектив. Может быть у меня будет время и желание делать обзоры статей и/или переводы. Постараюсь делать все это так, чтобы чтение было интересным и полезным.

Итак, начнем. Задача номер 1.

Давным давно... был у нас один проект, в рамках коего в БД (MS SQL 2000) нужно было грузить множество данных, приходящих, как водится, в XML. Для выполнения этой задачи был подряжен разработчик, который взял свой любимый Delphi и сбацал некий модуль, успешно справлявшийся с задачей. Не спрашивайте меня почему на Delphi и почему модуль, а не служба под виндой и не простой bcp, не важно. Вероятно были какие-то сторонние причины, которых я уже за давностью лет не вспомню. Важно, что приходивший на загрузку XML имел плоскую и однородную структуру - каждую ноду можно было, распарсив, смело вставлять в таблицу, одноименную имени ноды. И разработчик, покрутив в голове варианты, решил, что нужно использовать ADO и сделал примерно так:
rs = conn.OpenRecordset("SELECT * FROM " & node.nodeName)
For cn in node.Children loop
  with rs.Add
     For a in cn.Attributes Loop
        .Fields[a.Name].Value = a.Value
     Next
  end with
next
rs.UpdateBatch
я привожу псевдокод, это не Delphi и не VB, но ближе к последнему, потому что мне так проще. В общем, не пытайтесь повторить это дома! Код не рабочий

Такой подход позволил абстрагироваться от структуры приходящих файлов и БД (По крайней мере пока соблюдалось соглашение о соответствии структуры того и другого) и использовать приведенный кусок кода для всех типов приходящих данных.

Однако когда проект вышел в мир, начались проблемы. По мере возрастания количества данных (а там было много данных), данный модуль начал подтормаживать. А потом и откровенно тормозить.

Внимание, вопрос! Как почти не меняя программу заставить ее работать без задержек?

+ Ответ тут

Нужно было добавить
rs = conn.OpenRecordset("SELECT * FROM " & node.nodeName & " WHERE 1=0")
Тогда ADO перестает подтягивать в буфер данные с сервера при создании Recordset

Комментарии


  • Павел, правильное название продукта - Delphi.
    С уважением.

  • 03 декабря 2010, 07:33 Павел Воронцов

    iscrafm: спасибо. Был невниамателен, постараюсь впредь аккуратней.

  • 14 декабря 2010, 08:47 Программист-Любитель

    "WHERE 1=2" было бы чуть более наглядно



Необходимо войти на сайт, чтобы оставлять комментарии