IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Transaction pour les codes Java


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 61
    Par défaut Transaction pour les codes Java
    Bonjour,
    J'ai deux petites questions :

    J'ai une serie de HashMap. Dans une méthode, il faut que j'insere des différents <key, value> dans chacun des Map. Mais, il faut que je sois certain que tous les valeurs sont soit entrées soit aucune est faite. Plus simple, je veux dire comme le principe "Transaction - commit" en Base de donnée. Soit tout soit rien. Comme cela, je peux être certain que si une key existe dans le Map1, donc l'autre key existe aussi dans le Map2.

    Alors, comment faut-il regrouper ces insertions? je précise que dans certaines insertion il se peut y avoir des exceptions genre IO....

    Deuxième question : est-ce qu'il y a un moyen pour que un HashMap fonctionne dans les deux sens ? Cela dit, les valeurs doivent rester uniques et qu'on puisse supprimer un Entry en sachant sa valeur....

    Je vous remercie beaucoup.
    Soyez cool

  2. #2
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Tu es dans un environnement multithreadé ?
    Si je comprends bien...
    Tu insères <key, value> dans la 1ère map, la 2ème map, ...
    et il est possible qu'un autre thread prenne la main pour faire une recherche dans une des maps ?
    Je vois plusieurs pistes :
    Tu isoles les données communes dans une map dédiée 'mapCommons', ainsi l'insertion ne se fait qu'une fois. Quand tu recherches dans une map 'i', si tu ne trouves pas d'entrée, tu poursuis dans 'mapCommons' (il faudrait aussi faire de même pour les méthodes contains*, entrySet, ...)
    dans la même idée créer une classe MapDecorator qui implémente l'interface Map et encapsule une map (passée au constructeur)... ainsi toute la problématique de la délégation à la 'mapCommons' est encapsulée.
    tu maintiens un verrou qui te sert à synchroniser l'accès à n'importe quelle map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    synchronized (lock) {
       map1.put(k, v);
       map2.put(k, v);
       map3.put(k, v);
      ...
    }
     
    ...
    K laClefDeLaMap1 = ...
    synchronized (lock) {
       V laValeurDansLaMap1 = map1.get(laClefDeLaMap1);
       ...
    }
    D'autres pistes ?

    Pour la deuxième question il y a BidiMap de commons-apache

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 61
    Par défaut
    Merci pour la réponse.
    En fait je ne suis pas dans une situation multitread.
    Le problème est ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    map1.put(key1, val1)
    String line = reader.readLine()
    map2.put(key2, line)
    ....
    map3.put(key3, key1)
    du coup, il y a une série d'insertions qui peut être interrompue par une exception, le changement d'une condition etc.

  4. #4
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Euh dans ce cas je ne vois pas vraiment de problème...
    Une fois la clef commune connue et la valeur correspondante calculée, tu es certain que la série de put ne va pas planter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    K maClef = ...;
    V maValeur = ...;
     
    // Ici on commence
    map1.put(maClef, maValeur);
    map2.put(maClef, maValeur);
    map3.put(maClef, maValeur);
    ...
     
    // Ici, c'est terminé et toutes les map sont mises à jour

  5. #5
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Ah j'ai compris ce n'est pas la même valeur que tu insères dans les différentes map !

    Dans ce cas tu dois précalculer les clefs et les valeurs correspondantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    K maClef1 = ...;
    V maValeur1 = ...;
    K maClef2 = ...;
    V maValeur2 = ...;
     
    map1.put(maClef1, maValeur1);
    map2.put(maClef2, maValeur2);

Discussions similaires

  1. Composant pour les codes à barres
    Par Bourak dans le forum Composants VCL
    Réponses: 5
    Dernier message: 11/11/2005, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo