2013-07-22 2 views
5

«В отличии от идентичности, следующий номер для значения столбца будет извлечен из памяти, а не с диска - это делает последовательность значительно быстрее, чем идентичность» , определенными в этом article. Означает ли это, что идентификатор приходит с диска в случае идентификации, если да, то какой диск и как. Используя последовательность, я могу видеть в журнале дополнительный запрос select к db при вставке новой записи. Но я не нашел этот дополнительный запрос select в журнале в случае идентификации. Затем как последовательность становится быстрее, чем идентичность.Hibernate IDENTITY против ПОСЛЕДОВАТЕЛЬНОСТИ

Может кто-нибудь, пожалуйста, предоставить ценную информацию об этой сложности.

ответ

0

Хотя я лично новичок в Hibernate, из того, что я могу вспомнить, использование Identity в основном означает, что Hibernate будет проверять, что такое следующее возможное значение id из вашей БД и сохранить значение для него.

Для последовательности вы в основном указываете Hibernate для генерации следующего значения на основе определенной последовательности, которую вы ему предоставляете. Поэтому он должен фактически вычислить следующий идентификатор, посмотрев на следующее возможное значение id. Следовательно, дополнительный запрос запускается.

0

может быть, это будет ответить на ваш вопрос:

В отличие от значений столбца идентичности, которые образуются, когда ряды вставлены, приложение может получить следующий порядковый номер перед тем вставки строки, вызвав следующее значение функция. Последовательность присваивается при вызове NEXT VALUE FOR, даже если номер никогда не вставлен в таблицу. Функция NEXT VALUE FOR может быть использована как значение по умолчанию для столбца в определении таблицы. Используйте sp_sequence_get_range, чтобы получить диапазон из нескольких порядковых номеров в один раз.

вы можете найти деталь here

Идентичности оленьей кожи нужно, что дополнительный запрос на выборке, потому что идентичность представляет собой таблицу, в зависимости и последовательности не зависит от таблицы, но из-за этого мы можем получить последовательность еще до создания строки (когда вы выполняете session.save (объект T), последовательность генерируется даже до совершения транзакции).

последовательность: вы создаете или обновляете объекты -> каждый раз, когда вы сохраняете объект -> hibernate, получите следующее значение последовательности -> ваша программа возвращает значение после завершения процесса без исключения или отката -> вы совершаете транзакцию -> спящий режим вставить весь полный объект

identity: при совершении транзакции вставьте неполную сущность (необходимо получить ее из столбца идентификации). поэтому команда последовательности INSERT определенно медленнее, но преимущества в том, что если вы отмените вставку, счет не увеличится.

+0

Спасибо. На самом деле, я тоже перешел через ссылки. Если вам не нужен этот дополнительный запрос, то не могли бы вы прояснить, как последовательность становится быстрее, чем личность. – cooper

+0

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

7

стратегия используется последовательность:

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

стратегия, используемая идентичности:

Вставка строки без указания значения для идентификатора. После вставки строки спросите базу данных для последнего сгенерированного идентификатора.

Количество запросов, таким образом, одинаково в обоих случаях. Но, Hibernate использует по умолчанию стратегию, более эффективную для генератора последовательности. Фактически, когда он запрашивает следующее значение последовательности, он сохраняет 50 (это dafault, IIRC и его настраиваемый) следующие значения в памяти и использует эти 50 следующих значений для следующих 50 вставок. Только после 50 вставок он переходит в базу данных, чтобы получить 50 следующих значений. Это значительно уменьшает количество необходимых SQL-запросов, необходимых для автоматической генерации идентификаторов.

Стратегия идентификации не допускает такой оптимизации.

+0

Я бы также добавил, что SQL Server «резервирует» пакет порядковых номеров в кеше (таким образом, ** память **). По умолчанию это 50 (вероятно, это также резон, почему разработчики NH выбрали это значение для своей цели). Когда эти 50 номеров были использованы, SQL Server должен обновить свои системные таблицы, которые хранят последний использованный номер в заданной последовательности, чтобы «зарезервировать» следующую партию чисел - это операция ** диска **. Идентичность также кэшируется, но размер кеша составляет 5x (количество 10 чисел), и, таким образом, «генератор последовательности» более часто касается диска. – lowleveldesign

+0

@JB, спасибо. Я думаю, что это то, что я искал. Но в чем смысл - «спросить базу данных для последнего сгенерированного id» в случае Identity, это как автоинкремент. Могу ли я сказать, что есть передача данных также в обратном направлении, от db до приложения (в оба конца), в случае Identity и только от приложения к db (в одну сторону) в случае Sequence (при условии, что у нас нет распределения, определенного для последовательности) . Вероятно, я запутался, пожалуйста, исправьте. Я считаю, что без выделения. Каждый бит db запускает Select, чтобы получить последовательность. – cooper

+0

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

4

IDENTITY generator всегда будет нуждаться в базе данных, чтобы получить значение первичного ключа, не дожидаясь синхронизации синхронизации текущего entity state transitions с базой данных.

Таким образом, генератор IDENTITY плохо работает с Hibernate write-behind стратегией кеша первого уровня, поэтому JDBC-пакет отключен для генератора IDENTITY.

Генератор последовательности может извлечь выгоду из предварительного распределения базы данных, и вы даже можете использовать HI/LO optimization strategy.

На мой взгляд, лучшими генераторами являются pooled and pooled-lo sequence generators. Генераторы Thes объединяют генератор последовательности, совместимый с партиями, с оптимизацией генерации ценности на стороне клиента, которая совместима с другими клиентами БД, которые могут вставлять строки, не зная ничего о нашей стратегии генерации.

В любом случае, вы никогда не должны выбирать генератор TABLE, потому что it performs really bad. Если вам нужна переносимость, вы можете обратиться к нему с переопределяющими конфигурациями, как описано в this article.

+0

Как насчет генератора TABLE с конфигурацией allocSize? Это тоже плохо? –

+0

[Это худшее] (https: // vladmihalcea.ком/2017/01/04/почему вы-должны-никогда потребительной стол идентификатор-генератор-с JPA-и-спящий режим /). Вы спрашиваете об этом, потому что вам не нужно читать [мои 150 Hibernate tutorials] (https://vladmihalcea.com/tutorials/hibernate/), правильно? –

+0

Нет, у меня еще нет. Я собираюсь использовать аврору, и она не поддерживает последовательность. поэтому я изучаю последовательность таблиц ... спасибо за ваши статьи. –

Смежные вопросы