перенести большие данные из XML-файла в базу данных - PullRequest
2 голосов
/ 28 июля 2011

Q:

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

Что я делаюэто:

Я хочу перенести данные из XML-файла в аналогичные таблицы в моей базе данных .

например:

  • У меня есть два узла (файл XML):

    courses, teachers

  • Две таблицы (база данных)

    courses, teachers.

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

Проблема заключается в следующем:

Если во время операции вставки произойдет сбой, я хочу удалить все вставленные записи.во всех таблицах. (или откат).

Я начинаю думать о transaction, вставка каждой сущности будет выполняться посредством транзакции, но я сталкиваюсь с двумя проблемами:

  1. Должен ли я помещать все вставки всех сущностей в одну транзакцию или одну сущность по одной в транзакцию? (Все данные сущностей должны быть вставлены или вообще не вставляться) для каждого загрузчика.

  2. Когда у меня огромное количество записей (1500 записей), появляется следующее исключение:

    This IfxTransaCtion завершен;его больше нельзя использовать , никто его не исправляет.

  3. Руководитель моей команды сказал мне не использовать транзакцию, потому что она заблокирует таблицы, и многие пользователи используют эти таблицы.он хочет какой-то другой механизм.

пожалуйста, я хочу решить мою проблему (подробное объяснение), Как решить этот вопрос и поддерживать проблемы с производительностью, целостность и согласованность данных.

Ответы [ 3 ]

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

Вот механизм, который мы использовали в той же проблеме: начать сохранение данных во временных таблицах, если после вставки во временные таблицы нет исключений, запустите хранимые процедуры, которые копируют содержимое этих временных таблиц в реальныетаблицы, а после этого удаляют * из временных таблиц.Таким образом, вы не блокируете доступ к таблицам при использовании механизма транзакций.Существует другой механизм, но если вы используете его, вам придется переосмыслить всю структуру базы данных, он называется CQRS (для .NET существует API, называемый NCQRS)

1 голос
/ 30 августа 2011

Если я правильно понимаю, вы делаете пакетную вставку.Почему бы не использовать Spring Batch, в котором есть средства перезапуска с последней точки сбоя, повторной попытки, разбиения на блоки, разделения данных и т. Д. *

Я знаю, что вы пометили asp.net, но загрузка данных может произойти втехнологически независимый и отделенный путь.Не так ли?

1 голос
/ 28 июля 2011

Я бы предложил использовать SqlBulkCopy.Вы можете погуглить или прочитать эти 2 статьи:

  1. http://blogs.msdn.com/b/nikhilsi/archive/2008/06/11/bulk-insert-into-sql-from-c-app.aspx
  2. http://www.dotnetcurry.com/ShowArticle.aspx?ID=323
...