Массовая вставка или обновление NHibernate - PullRequest
7 голосов
/ 18 февраля 2009

Привет. Я работаю над проектом, в котором нам нужно обрабатывать несколько XML-файлов один раз в день и заполнять базу данных информацией, содержащейся в этих файлах.

Каждый файл занимает примерно 1 МБ и содержит около 1000 записей; нам обычно нужно обработать от 12 до 25 из этих файлов. Я видел некоторую информацию о массовых вставках с использованием NHibernate, но наша проблема несколько сложнее, так как XML-файлы содержат новые записи, смешанные с обновленными записями.

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

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

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

Ответы [ 2 ]

17 голосов
/ 18 февраля 2009

Пара идей:

  • Всегда старайтесь использовать IStatelessSession для массовых операций.
  • Если вы все еще не удовлетворены производительностью, просто пропустите NHibernate и используйте хранимую процедуру или параметризованный запрос, специфичный для этого, или используйте IQuery.ExecuteUpdate ()
  • Если вы используете SQL Server, вы можете преобразовать свой xml-формат в BCPFORMAT xml, а затем запустить BULK INSERT (только для вставок)
  • Если у вас слишком много блокировок БД, попробуйте сгруппировать операции (то есть сначала выясните, что нужно вставить и что обновить, затем получите PK для обновлений, затем запустите BULK INSERT для вставок, затем запустите обновления)
  • Если синтаксический анализ исходных файлов является проблемой производительности (т. Е. Он увеличивает нагрузку на ядро ​​ЦП), попробуйте сделать это параллельно (вы можете использовать Параллельные расширения )
2 голосов
/ 30 марта 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...