Почему ECLIPSELINK потребляет целый выделений каждый раз, когда он перезагружен?

StackOverflow https://stackoverflow.com/questions/4037669

Вопрос

Я только что заметил, что для 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 Стратегия. Я думал, что Эль будет вести себя так же. Но я мог бы ошибаться, это не кажется обязанным спецификацией.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top