Quelle est la différence entre: l'identifiant de la séquence utilisant JPA @TableGenerator, @GeneratedValue et la base de données Auto_Increment
T1.: Quelle est la différence entre l'application de la séquence Id dans une base de données à l'aide de
A.
CREATE TABLE Person
(
id long NOT NULL AUTO_INCREMENT
...
PRIMARY KEY (id)
)
contre
B.
@Entity
public class Person {
@Id
@TableGenerator(name="TABLE_GEN", table="SEQUENCE_TABLE", pkColumnName="SEQ_NAME",
valueColumnName="SEQ_COUNT", pkColumnValue="PERSON_SEQ")
@GeneratedValue(strategy=GenerationType.TABLE, generator="TABLE_GEN")
private long id;
...
}
Mon système est hautement simultanées. Depuis ma DB est un serveur Microsoft SQL server, je ne pense pas qu'il prend en charge @SequenceGenerator
donc je dois rester avec @TableGenerator
qui est sujette à des problèmes de concurrence.
T2. Ce lien ici (http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Advanced_Sequencing) suggère que B risque de souffrir de problèmes de concurrence, mais je ne comprends pas la solution proposée. Je serais très heureux si quelqu'un pouvait m'expliquer comment faire pour éviter des problèmes de concurrence avec B. Voici un extrait de leur solution:
If a large sequence pre-allocation size is used this becomes less of an issue, because the sequence table is rarely accessed.
T2.1: Combien de répartition de la taille parlons-nous ici? Dois-je faire allocationSize=10
ou allocationSize=100
?
Some JPA providers use a separate (non-JTA) connection to allocate the sequence ids in, avoiding or limiting this issue. In this case, if you use a JTA data-source connection, it is important to also include a non-JTA data-source connection in your persistence.xml.
T2.2: - je utiliser EclipseLink que mon fournisseur; ce que je dois faire ce qu'il suggère ci-dessus?
T3. Si B souffre de problèmes de concurrence, ne Un subir le même?
source d'informationauteur Thang Pham
Vous devez vous connecter pour publier un commentaire.
À l'aide d'un TableGenerator la prochaine valeur de l'id sera regardé et entretenue dans un tableau et pour l'essentiel maintenues par JPA, et non votre base de données. Ceci peut conduire à un problème de concurrence lorsque vous avez plusieurs threads d'accéder à votre base de données et d'essayer de comprendre ce que la prochaine valeur pour le champ id peut être.
L'auto_increment type de votre base de données en prendre soin au sujet de la prochaine id de votre table, c'est à dire. il sera déterminé automatiquement par le serveur de base de données lors de l'exécution de l'insert, ce qui est sûrement la simultanéité coffre-fort.
Mise à jour:
Est-il quelque chose qui vous éloigne de l'aide GenerationType.AUTO?
GenerationType.AUTO sélectionne un moyen approprié pour récupérer l'id de votre entité. Donc, dans le meilleur des cas en utilise la fonctionnalité intégrée. Cependant, vous devez vérifier le Sql généré et de voir exactement ce qui se passe là - comme MSSQL n'offre pas de séquences je suppose qu'il serait de l'utiliser GenerationType.L'IDENTITÉ.
Comme l'a dit le type de colonne auto_increment prend soin sur l'attribution de la prochaine valeur de l'id, c'est à dire. il n'y a pas de problème de concurrence là - même avec plusieurs threads s'attaquer à la base de données en parallèle. Le défi est de transférer cette fonction pour être utilisé par JPA.
Un: utilise l'IDENTITÉ de génération d'id, @GeneratedValue(IDENTITÉ)
B: utilise le TABLEAU de génération d'identifiant
JPA prend en charge trois types, d'IDENTITÉ, de SÉQUENCE et de la TABLE.
Il existe des échanges avec les deux.
IDENTITÉ ne permet pas de preallocation, exige un supplément de SÉLECTIONNER après chaque INSERTION, les empêche de lot de l'écriture, et nécessite une chasse d'eau pour accéder à l'id qui peut conduire à une mauvaise concurrence.
TABLEAU permet preallocation, mais peut avoir des problèmes de concurrence avec des serrures sur la séquence de la table.
Techniquement SÉQUENCE de génération d'identifiant est le meilleur, mais pas toutes les bases de données de soutien.
Avec TABLE de séquençage si vous utilisez un preallocaiton taille de 100, alors que tous les 100 insère verrouiller la ligne dans la séquence de la table, donc tant que vous n'avez pas ont souvent des 100 insère dans le même temps, vous ne subira aucune perte dans la simultanéité. Si l'application n'beaucoup de plaquettes, peut-être recours à 1000 ou plus de la valeur.
EclipseLink utilisera une transaction distincte pour TABLE de séquençage, de sorte que tout problème de concurrence avec les verrous de la séquence de la table sera réduit. Si vous utilisez JTA, vous devez spécifier un non-jta-source de données pour ce faire et configurer une séquence de connexion dans votre piscine persistence.xml les propriétés.