При использовании стратегии GenerationType.AUTO
с Derby EclipseLink по умолчанию использует стратегию таблицы генератора .
Затем, когда требуется генерация Id
, EL будет предварительно распределять идентификаторы в соответствии сallocationSize
(по умолчанию 50).Для этого он сначала обновит столбец, в котором хранится последнее сгенерированное значение, чтобы увеличить его на allocationSize
:
UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
bind => [50, SEQ_GEN]
, а затем прочитает новое значение:
SELECT SEQ_COUNT FROM SEQUENCE WHERE SEQ_NAME = ?
bind => [SEQ_GEN]
После этого EL предварительно выделяет пул идентификаторов, используя текущее значение - allocSize + 1 как «первое» и значение как «последнее»:
local sequencing preallocation for SEQ_GEN: objects: 50 , first: 1, last: 50
И будет обслуживать идентификаторы из памяти, пока не достигнет последнего значения и не перезапустит цикл.
Теперь, если вы перезапустите JVM, для EL просто не существует другого безопасного способа, кроме предварительного выделения нового пула идентификаторов ".потеря «тех из« предыдущего »диапазона, которые не использовались (например, multi-JVM и т. д.), что объясняет« скачок »от 2 до 51 в вашем примере.
Если вы хотите избежать этого,я бы предложил перейти на стратегию IDENTITY
, которая поддерживается Derby (я не думаю, что было бы неплохо настроить генератор таблиц для использования allocationSize
из 1).
Я не думаю, что настройка генератора таблицы для использованияВыделение 1 - хорошая идея.Почему бы и нет?
Из-за снижения производительности, если вам нужно читать из таблицы «последовательность» для каждой вставки.Но, с другой стороны, 1) это не может быть проблемой в вашем случае 2) Это единственная стратегия, которая позволяет получить действительно последовательные идентификаторы.
Если вам интересно, вы сможете настроить это глобально, используя элемент table-generator
в XML-дескрипторе.
EL крайне не одобряет стратегию идентификации, к тому же она кажетсяявляются минами (потому что вы должны подождать, чтобы зафиксировать, прежде чем читать значение, что-то, что я мог бы где-то делать).
Ну, я не могу подтвердить для EL (я не буду проверять это прямо сейчас), но Hibernate выполняет немедленную вставку на persist
, когда вы используете стратегию IDENTITY
.Я думал, что EL будет вести себя так же.Но я могу ошибаться, это, похоже, не предписано спецификацией.
Ссылки