Pourquoi Eclipselink consomme-t-il l'ensemble des alloccations sur la fois qu'il est redémarré?

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

Question

Je viens de remarquer que pour l'ID de mon entité, EclipseLink attribue un ID 1 + le précédemment attribué à la même session (1), par opposition au tableau des éléments (2). Cela va à l'encontre de mes attentes de candidature.

Quelle est la façon la plus simple de le dire de faire 2?

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int objId;

Et voici ce que j'ai dans la base de données:

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                                                                                      
Était-ce utile?

La solution

Lorsque vous utilisez un GenerationType.AUTO Stratégie avec Derby, EclipseLink est par défaut générateur de table stratégie.

Ensuite, lors de la génération d'un Id est requis, El préservera les ID en fonction du allocationSize (qui est 50 par défaut). Pour ce faire, il mettra d'abord à jour la colonne qui stocke la dernière valeur générée pour l'incrémenter par le allocationSize:

UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
    bind => [50, SEQ_GEN]

Et lira ensuite la nouvelle valeur:

SELECT SEQ_COUNT FROM SEQUENCE WHERE SEQ_NAME = ?
    bind => [SEQ_GEN]

Une fois terminé, El préalque un pool d'identiques en utilisant le courant évaluer - allocation + 1 comme "d'abord" et évaluer comme dernière":

local sequencing preallocation for SEQ_GEN: objects: 50 , first: 1, last: 50

Et servira des ID de mémoire jusqu'à ce qu'il atteigne la dernière valeur et redémarrera un cycle.

Maintenant, si vous redémarrez le JVM, il n'y a tout simplement pas d'autre moyen sûr pour EL plutôt que de préaller un nouveau pool d'ID, de "perdre" ceux de la gamme "précédente" qui n'a pas été utilisée (pensez à plusieurs JVM, etc.), qui Explique le "saut" de 2 à 51 dans votre exemple.

Si vous voulez éviter cela, ma suggestion serait de passer à un IDENTITY stratégie qui est prise en charge par Derby (je ne pense pas que la configuration du générateur de table allocationSize de 1 serait une bonne idée).


Je ne pense pas que la configuration du générateur de table pour utiliser une allocation de 1 serait une bonne idée. Pourquoi pas?

En raison du coup de performance si vous devez lire à partir de la table "Séquence" pour chaque insert. Mais d'un autre côté, 1) Ce n'est peut-être pas une préoccupation dans votre cas 2), c'est la seule stratégie qui permet d'obtenir des ID vraiment séquentiels.

Si vous êtes intéressé, vous devriez être en mesure de configurer ce table-generator élément du descripteur XML.

EL décourage fortement la stratégie d'identité, en outre, il semble qu'il y ait des mines (car vous devez attendre pour vous engager avant de lire la valeur, quelque chose que je pourrais faire quelque part).

Eh bien, je ne peux pas confirmer pour EL (je ne testerai pas cela maintenant) mais Hibernate effectue un insert immédiat sur persist Lorsque vous utilisez un IDENTITY stratégie. Je pensais que El se comporterait de la même manière. Mais je me trompe peut-être, cela ne semble pas mandaté par la spécification.

Références

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top