Массовая вставка NHibernate без выбора идентификатора в конце - PullRequest
2 голосов
/ 13 февраля 2012

Я поиграл с несколькими способами пакетной вставки списка из 10000 объектов в мою базу данных.

Эти объекты не имеют каких-либо связей и хранят только данные POCO.

Я начал использовать StatelessSession, как предлагалось во многих статьях, и заметил заметное улучшение.

Однако остается одна вещь - после каждой вставки NHibernate делает инструкцию SELECT, чтобы получить идентификатор вставленного объекта. Есть ли способ отложить это до того момента, когда я собираюсь фактически запросить объекты? Похоже, было бы огромным выигрышом в производительности, если бы NHibernate мог просто вставлять строки и не беспокоиться об идентификаторах.

Возможно ли это?

Ответы [ 2 ]

2 голосов
/ 13 февраля 2012

Нет, это невозможно, иногда стоит рассмотреть подходящий инструмент для работы.Если в вашей таблице есть столбец идентификаторов, тогда NHibernate ALWAYS следует за выбором со вставкой даже для вставок BULK.Еще одна вещь, которую стоит учесть, это то, что ваш кэш первого уровня станет довольно большим (если вы не используете сеансы без сохранения состояния), и это может привести к другим сложностям.

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

Если мне нужно отправить 10K вставок в свою базу данных, яНапример, можно использовать класс SQlBulkCopy и вообще обойти NHibernate.

SQLBulkCopy позволяет эффективно загружать таблицу SQL Server с данными из другого источника.

См. здесь для более информация

0 голосов
/ 13 февраля 2012

Вы можете изменить генерацию идентификатора, чтобы использовать guids или какой-либо другой вычисляемый тип на стороне сервера, и, таким образом, sql не нужно возвращать идентификаторы, как вы их уже знаете, и просто передавать их в запросе sql для вставки

см. это для более подробной информации о доступных подходах

и это для более подробного объяснения генераторов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...