2009-02-20 8 views
0

J'ai créé deux threads (ou plus) pour insérer des données dans une table de la base de données. Lors de l'insertion, il y a un champ CreatedDateTime, qui bien sûr, stocke la date et l'heure de la création de l'enregistrement. Dans un cas, je souhaite que les threads restent synchronisés, afin que leur champ CreatedDateTime ait exactement la même valeur. Lors de l'essai avec multi threading, d'habitude j'ai différentes millisecondes ...Comment puis-je obtenir deux thread pour insérer des horodatages spécifiques dans une table?

Je veux tester différents scénarios dans mon système, tels que:

  • 1) insertion de l'enregistrement des conflits exactement en même temps.
  • 2) problèmes de commande/sélection d'enregistrements.
  • 3) Problèmes avec le regroupement de connexions à la base de données.
  • 4) Problèmes avec plusieurs utilisateurs (centaines) accédant en même temps.

Il peut y avoir d'autres cas de test que je n'ai pas énumérés ici.

+0

Cela va à l'encontre de l'idée d'avoir un ordonnanceur de threads ... – GEOCHET

+0

Je pense que vous ne comprenez pas le terme synchronisé. –

+0

Je pense que l'OP veut générer un horodatage qui peut être partagé entre plusieurs threads? @Click OK: Peut-être que vous devriez reformuler votre question, et donner un exemple de ce que vous voulez avoir. –

Répondre

5

Oui, c'est ce qui se passe. Même si, par un certain caprice de la nature, vos threads devaient démarrer exactement au même moment, ils seraient rapidement hors de la ligne simplement à cause des conflits de ressources entre eux (au minimum, accès à la table DB ou au serveur SGBD). S'ils restent la plupart du temps en phase (c'est-à-dire, ne dépassant jamais quelques millisecondes), choisissez simplement une "résolution" différente pour votre champ CreatedDateTime. Mettez-le dans le 10 le plus proche d'une seconde (ou deuxième) plutôt que milliseconde. Ou utilisez des valeurs fixes d'une autre manière. Sinon, il suffit de se rendre compte que c'est un comportement parfaitement normal. Et comme l'a souligné BC dans un commentaire, vous pouvez mal comprendre l'utilisation du mot «synchronized». Il est utilisé (en Java, j'espère que C# est similaire) pour s'assurer que deux threads n'accèdent pas à la même ressource en même temps. En réalité, cela garantit presque que les discussions ne resteront pas synchronisées comme vous le comprenez (personnellement je pense que votre définition est juste en termes d'usage en anglais (les choses se passent en même temps) mais certains langages informatiques ont suborné la définition de leurs propres buts). Si vous testez ce qui se passe lorsque des horodatages spécifiques entrent dans la base de données, vous ne pouvez pas compter sur les threads qui se comportent d'eux-mêmes en étant planifiés dans un ordre spécifique et à des moments spécifiques. Vous avez vraiment besoin de simuler les données d'une façon ou d'une autre, sinon c'est comme essayer de coller de la gelée à un arbre (ou d'entraîner un chat).

Une solution consiste à ne pas utiliser des éléments tels que getCurrentTime() ou now() mais utiliser un ensemble spécifique d'insertions ayant des horodatages connus. En fonction de votre architecture actuelle, cela peut être difficile (par exemple, si vous appelez simplement une API qui elle-même obtient l'horodatage actuel à la résolution d'une milliseconde).

Si vous contrôlez le code SQL réel qui remplit la colonne timestamp, vous devez modifier cela pour utiliser des valeurs précalculées plutôt que le now() ou ses équivalents.

+0

Mais il ne répond pas à la question de savoir comment générer une valeur date-heure identique à partir de différents threads (ou utiliser le même horodatage dans plus d'un thread en toute sécurité). –

0

Si vous souhaitez avoir les mêmes horodatages sur plusieurs lignes insérées; vous devez créer un thread SQL qui fera une insertion multirow dans une requête qui vous permettra d'obtenir les mêmes horodatages.Autre que cela, je suis d'accord avec tout le monde, vous ne pouvez pas obtenir un horodatage exact à une résolution énorme avec multithreads sauf si vous deviez insérer l'horodatage tel qu'il est vu dans l'application et partager cet horodatage à insérer. Ceci bien sûr, jette les problèmes de caveat des discussions par la fenêtre. C'est comme dire, je vais partager ces données, mais je ne veux pas utiliser les mutex car ils arrêtent l'autre thread du traitement une fois qu'il a atteint un lock().

Questions connexes