Générer des ID unique en Java, à l'étiquette des groupes d'entrées dans un journal

Il y a plusieurs posts sur DONC sur ce sujet. Chacun de ces parler d'une approche spécifique de sorte voulais juste prendre une comparaison dans une question.

À l'aide de new Date() comme identifiant unique

Générer un identificateur global unique en Java

Je suis en train d'implémenter une fonctionnalité où nous sommes en mesure d'identifier certains événements dans le fichier journal. Ces événements doivent être associées à un identifiant unique.
Je suis en train d'essayer de trouver une stratégie pour cette unique ID de génération.
L'ID est d'avoir 2 parties :
des informations statiques + dynamiques de l'information
Les journaux peuvent être recherchés pour le motif lors du débogage des événements est nécessaire.
J'ai trois façons :

  • statique info + Joda Date heure("abc"+2014-01-30T12:36:12.703)
  • statique info + Atomique Entier
  • statique info + UUID

Pour la portée de cette question, plusieurs Jvm n'est pas une considération.
J'ai besoin de générer des Identifiants uniques d'une façon efficace, sur un JVM. Aussi, je ne vais pas être en mesure d'utiliser une base de données dépendante de la solution.

Laquelle des 3 stratégies mentionnées ci-dessus fonctionne le mieux ?

  • Si ce n'est celui de la ci-dessus, toute autre stratégie ?
  • Est le Joda du temps en fonction de la stratégie robuste ? La JVM est unique mais il y aura d'utilisateurs simultanés de sorte qu'il peut être concomitante des événements.
  • En conjonction avec l'un des/d'autres stratégies, Dois-je faire de ma méthode thread-safe /synchronisées ?
  • Définir les œuvres de meilleur".
  • "qui fonctionne le mieux" : j'ai besoin de générer des Identifiants uniques d'une façon efficace, sur un JVM
  • Jetez un oeil à UUID.randomUUID().
  • Merci, mais comment cela se compare avec la Joda time?
  • C'est pourquoi j'ai laissé ce qu'un commentaire, car il ne répond pas entièrement à votre question. Juste un conseil.
  • UUID.randomUUID() est une méthode synchronisée et ne fonctionne pas correctement sous haute lice. La création de Joda objets pour chaque identificateur apparaît plutôt inutiles aussi. J'avais utilisation du Système.currentTimeMillis() ou nanoTime() + atomique compteur.
  • Dites que vous voulez lier ensemble plusieurs entrées dans un journal? Les entrées peuvent être entrelacées avec d'autres sans rapport avec les entrées, de sorte que vous voulez être en mesure de requête uniquement pour les entrées connexes – c'est que votre question?
  • Avez-vous des numéros de citer? Moderne Jvm, une méthode synchronisée n'est pas cher. Il est difficile d'imaginer que, dans le contexte de l'enregistrement de l'OP serait de générer suffisamment de Uuid de faire tout impact sur les performances du monde réel. Mon test: Une boucle d'un million d'appels à java.util.UUID.randomUUID() dans Java 8 bêta 127 de Netbeans 7.4 cours d'exécution à l'intérieur d'une Parallels 9 machine virtuelle sous Mountain Lion sur un Mac mini (Intel i7) l'exécution de Mavericks. Résultats: 2 millisecondes par UUID. Accordée, qui est sans prétention, mais néanmoins, je dirais que votre préoccupation est de "l'optimisation prématurée".
  • Merci pour vos contributions. Pas sûr de ce que "lier ensemble" signifie. Pour simplifier : Un événement, générer un & journal d'un id liée à cet évènement, de le rechercher à l'aide de l'identifiant généré. Espérons qu'il soit clair
  • Si vous avez une seule entrée que vous devez rechercher dans votre journal, claque un UUID sur l'entrée et vous avez terminé. Mais votre question me semble être plus que cela. Voulez-vous dire quelque chose comme Susan (ou Thread 'A') est en cours d'exécution du code qui permet de faire plusieurs entrées de journal, et Bob (ou le Fil "B") est en cours d'exécution de ce même code, et étant donné que les entrées de journal regarder de prêter à confusion, comme vous voulez être en mesure de trouver la collection de Susan entrées à partir d'une seule exécution de code tout en ignorant Bob entrées?
  • Susan et Bob, les deux sont simultanément l'accès à l'application. Dans le cadre de leur travail, les événements ont été soulevées et connecté. J'ai besoin d'être en mesure de distinguer les événements qui sont liés à Susan/Bob . Et donc j'ai un mécanisme en place pour le faire, juste besoin de s'assurer que l'enregistrement de la partie les utilisations distinctes id. UUID semble correspondre au projet de loi.
  • Concernant mon commentaire ci-dessus sur l'évaluation de la vitesse de génération des Uuid mentionné ci-dessus, reportez-vous à cette autre réponse que la mienne pour plus d'informations sur ce test ainsi qu'une extension du test de contention où 3 fils tout à la fois de générer des millions d'Uuid. Conclusion: la Discorde ne fait pas de monde réel impact sur les performances.
  • Je vais regarder le lien. Aussi, je serais certainement en valeur vos entrées sur mon commentaire à la réponse de Msf
  • Eh bien, si tel est le cas, alors la question est "l'optimisation prématurée". Nous créons aussi des Id de corrélation pour la journalisation. Cela ne signifie pas que tous les ID seront consignées. Nous de traiter simultanément >10'000 événements par seconde et la randomUUID() a été un goulot d'étranglement pour nous (2ms est-âge, vraiment). Découvrez ce article et d'autres LMAX/perturbateur articles connexes de trouver des chiffres sur le coût de verrouillage, avec et sans prétention.
  • Bon, maintenant, je vois votre point de vue. Sur une échelle de 10 000 événements par seconde, ces préoccupations peuvent être justifiée. C'est au-delà de l'expérience de moi et de mes collègues (en interne départements d'une entreprise ou de niche de sites web).

InformationsquelleAutor souser | 2014-02-03