Почему ECLIPSELINK потребляет целый выделений каждый раз, когда он перезагружен?
-
27-09-2019 - |
Вопрос
Я только что заметил, что для ID моего сущности ECLIPSELINK назначает ID 1 + ранее присвоенный в той же сессии (1), в отличие от таблицы элементов (2). Это происходит против моих ожиданий приложений.
Какой самый простой способ сказать это сделать 2?
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int objId;
И вот что у меня в базе данных:
ij> connect 'jdbc:derby:db';
ij> set schema memo;
0 Zeilen eingef?gt/aktualisiert/gel?scht
ij> select * from meaning;
OBJID |LASTPUBLI&|USR_EMAIL
-------------------------------------------------------------------------------------------------------------------------------------------------------
1 |NULL |NULL
2 |2010-10-27|NULL
51 |NULL |NULL
101 |NULL |NULL
Решение
При использовании A. GenerationType.AUTO
стратегия с дерби, 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 PrealLocate бассейн идентификаторов с использованием текущего стоимость - выделение + 1 как «первая» и стоимость как «последний»:
local sequencing preallocation for SEQ_GEN: objects: 50 , first: 1, last: 50
И будет служить идентификаторам из памяти, пока она не достигнет последнего значения и будет перезапустить цикл.
Теперь, если вы перезапустите JVM, для EL просто нет другого безопасного способа, чем Perallocation нового пула идентификаторов, «потерять» те, которые из диапазона «предыдущего», которые не использовались (думают, что Multi-JVMS и т. Д.) Объясняет «прыжок» от 2 до 51 в вашем примере.
Если вы хотите избежать этого, мое предложение будет переключаться на IDENTITY
стратегия, которая поддерживается дерби (я не думаю, что настроить генератор таблицы для использования allocationSize
из 1 было бы хорошей идеей).
Я не думаю, что настроить генератор таблицы для использования аллецизированных из 1, был бы хорошей идеей. Почему бы нет?
Из-за попадания производительности, если вы должны прочитать из таблицы «Последовательность» для каждой вставки. Но с другой стороны, 1) Это не может быть проблемой в вашем случае 2) это единственная стратегия, которая позволяет получить действительно последовательные идентификаторы.
Если вы заинтересованы, вы должны быть в состоянии настроить это глобально, используя table-generator
Элемент в дескрипторе XML.
Эль очень препятствует стратегии идентичности, кроме того, кажется, есть мины (потому что вы должны дождаться, чтобы совершить, прежде чем читать ценность, что-то, что я мог бы делать где-то).
Ну, я не могу подтвердить для EL (я не буду тестировать это прямо сейчас), но Hibernate выполняет немедленную вставку на persist
когда вы используете IDENTITY
Стратегия. Я думал, что Эль будет вести себя так же. Но я мог бы ошибаться, это не кажется обязанным спецификацией.