Séquence Générateur en Java pour les Id Unique
Je prévois d'écrire un générateur de séquence qui sera utilisé
dans mon REPOS des ressources de mise en œuvre de la classe pendant le post pour générer
id unique. Depuis chaque requête post est gérée par un thread séparé,
J'ai fait la variable volatile et méthode synchronisée.
Je n'ai pas d'option pour utiliser des séquences ou quelque chose qui
traditionnelle SGBD fournit.
public class SequenceGen {
volatile static int n = 0;
public synchronized int nextNum(){
return n++;
}
}
c'est ce que j'ai à ce jour, et de la planification pour créer une variable de
SequenceGen dans mon REPOS de mise en Œuvre. Ma question est la volonté de
il casse quelque part ? J'ai testé avec les deux fils et je ne vois pas
toute valeur répétée.
faire
Si vos premiers essais montrent qu'il fonctionne et que votre logique dit, il doit travailler, en règle générale, vous ne devriez pas vous inquiéter à ce sujet plus et accepter que cela fonctionne (pour l'instant). S'inquiéter quand il fait pose un problème.
Pourquoi ne pas simplement utiliser un
Plus d'une jvm impliqués dans le processus? Dans votre POC, je suppose que vous utilisez une seule jvm.
Le champ doit être privé. volatile est redondante, puisque vous avez accès à l'aide d'une méthode synchronisée. Mais je suis d'accord avec fge: un AtomicInteger est un meilleur, plus sûr, plus rapide solution. Si vous prévoyez d'avoir plusieurs machines virtuelles, vous devez envisager d'utiliser un UUID à la place (mais vous aurez une Chaîne de caractères et non un int)
nextNum
méthode static
pour le rendre sûr.Si vos premiers essais montrent qu'il fonctionne et que votre logique dit, il doit travailler, en règle générale, vous ne devriez pas vous inquiéter à ce sujet plus et accepter que cela fonctionne (pour l'instant). S'inquiéter quand il fait pose un problème.
Pourquoi ne pas simplement utiliser un
AtomicInteger
?Plus d'une jvm impliqués dans le processus? Dans votre POC, je suppose que vous utilisez une seule jvm.
Le champ doit être privé. volatile est redondante, puisque vous avez accès à l'aide d'une méthode synchronisée. Mais je suis d'accord avec fge: un AtomicInteger est un meilleur, plus sûr, plus rapide solution. Si vous prévoyez d'avoir plusieurs machines virtuelles, vous devez envisager d'utiliser un UUID à la place (mais vous aurez une Chaîne de caractères et non un int)
OriginalL'auteur Ayan | 2014-03-14
Vous devez vous connecter pour publier un commentaire.
Cela va fonctionner, cependant
AtomicInteger
est un type qui est parfait pour votre cas d'utilisation.Merci pour le pointeur, qui a aidé.
OriginalL'auteur anttix
Vous pouvez prendre avantage de
java.util.préf.Préférences
à persister à l'état actuel de votre générateur de séquence sur le disque et de le réutiliser plus tard.(aussi, vous souhaitez peut-être utiliser plusieurs générateurs de séquence)
c'est à dire
OriginalL'auteur FaNaJ
Si vous êtes ouvert à l'aide de
String
pour les Id, au lieu deint
, vous voudrez peut-être regarder dans l'aide deUUID
(Universally Unique Identifier). Très facile à utiliser et comme son nom l'indique, ils sont uniques. Voici un exemple de la façon de générer un:Un
UUID
fournit également une meilleure sécurité que leint
parce qu'avec des entiers, vous pouvez deviner le prochain ID de la demande par simple ajout de 1 pour votre numéro de demande, mais Uuid ne sont pas séquentielles et les chances de quiconque en haleine de quelqu'un d'autre l'ID de la demande sont assez minces.veuillez fournir des précisions. Combien de performances est-il?
Dans mon cas, le rendement est très mauvais, donc je joint un profiler et se rendit compte qu'en fait, il frappe le disque dur. Vous pouvez toujours l'ajouter dans une boucle et de voir comment lent c'est pour vous HW. Au-dessous de la réponse qu'il a été 1100ms. stackoverflow.com/questions/14532976/...
OriginalL'auteur SergeyB