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

Persistance des données Java Discussion :

[ehcache] Cohérence des données


Sujet :

Persistance des données Java

  1. #1
    Membre éprouvé Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Points : 1 161
    Points
    1 161
    Par défaut [ehcache] Cohérence des données
    Bonjour

    voici mon problème.
    J'ai une table qui va contenir des volumes importants de données (pour l'instant je n'ai pas de volumetrie mais en tout cas les perspectives fonctionnelles ne laissent pas de doute)

    Le problème c'est que dans l'application que je maintiens afin de faire des opérations unitaires de suppression ou de modification on utilise une requête qui lit toute la table (select * from maTable) et tout cela dans une magnifique boucle for.

    la première étape a été d'enlever cette requete de chargement de toute la table de la boucle ...
    Mais à mon avis ça ne suffira pas à l'avenir.

    du coup je pense à utiliser un système de cache pour eviter de charger toute la table => d'où ehcache.

    mais j'ai un doute sur le fonctionnement que j'ai implémenté
    Je me suis basé sur le user guide de ehcache et je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	Element elementToCache = getMyCache().get("myKey");
    if (elementToCache != null){
     return (MyObject)elementToCache.getObjectValue();
    }
    //ici je refais ma requete SQL
    getMyCache().put(new Element("myKey",_return)); //_return represente le retour de ma requete SQL
    je fais plusieurs tests basiques :
    - je vérifie que la première fois on va bien chercher en base
    - je vérifie que les fois suivantes on utilise le cache tant que l'on a pas dépassé le timeToLiveSeconds
    - et je vérifie que une fois le timeToLiveSeconds dépassé on refais une requete en base

    jusque là pas de problème

    par contre là où j'ai des doutes est sur la cohérence des données et je ne sais pas comment la tester.

    Imaginons que j'ai une requete qui supprime un objet => je récupere le contenu de mon cache, je fais mes traitements et je supprime
    Imaginons que j'ai une seconde requete qui veut supprimer/modifier le même objet => je récupere le contenu de mon cache , je fais mes traitements et je supprime/modifie

    Ma question est : est-ce que l'objet que je supprime de ma base à l'étape 1 est toujours dans le cache au moment de la deuxième requête ? ( on suppose que la durée de vie n'est pas dépassée)

    en gros je voudrais savoir si il y a un méchanisme de synchronization automatique entre la base et le cache ?


    N.B: l'application n'utilises pas d'ORM et on interroge la base en direct avec du JDBC ...

    merci d'avance pour vos eclaircissements et si ma question n'est pas claire faites le moi savoir

  2. #2
    Membre confirmé Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Points : 577
    Points
    577
    Par défaut
    C'est au programme de maintenir en état différents objets du cache.
    En gros pour un DAO implémenté su JDBC (ou un type d'objet donnée), le plus simple est de faire un remove du cache sur les actions qui entraine un delete ou un update.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cache.remove(monInstance.getKey());
    Si tu as beaucoup de classes et de DAI c'est pas mall que tous les classes d'objets persistant implémentent une interface getKey() qui permet de récupérer la clé unique pour le cache du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       retrun this.getClass().getName() + "_" + this.getId();
    Ensuite c'est pas mal d'utiliser l'AOP de spring pour décorer les méthodes des DAO, ça marche bien.

  3. #3
    Membre éprouvé Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Points : 1 161
    Points
    1 161
    Par défaut
    Tout d'abord merci d'avoir répondu à ma question
    sinon effectivement j'avais pensé à supprimer du chache lors d'un mise à jour de la base.
    Malheureusement je ne peux pas utiliser l'AOP de spring pour décorer les méthodes des DAO.
    C'est un projet existant et ça serait trop couteux pour mon objectif final.

    en tout cas merci encore

  4. #4
    Membre confirmé Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Points : 577
    Points
    577
    Par défaut
    Juste pour la remarque de l'AOP, justement un des objectifs de l'AOP c'est de décorer les méthode de projet existant à moindre frais sans modifier le code source initiale. Et vu que c'est configurable on peut facilement retrouver le comportement initial en modifiant la configuration spring. Réécrire les DAO avec le cache à mon avis c'est pas une mince affaire.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Cohérence des données - MySQL, import massif et multiple en même temps
    Par okoweb dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 11/03/2015, 23h59
  2. TRIGGER/cohérence des données/perf !?
    Par Liloye dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 12/01/2012, 09h40
  3. Lier, modifier et cohérence des données issues de deux tables
    Par lawappe dans le forum Bases de données
    Réponses: 33
    Dernier message: 20/03/2009, 17h11
  4. Réponses: 3
    Dernier message: 08/10/2008, 16h34
  5. Réponses: 2
    Dernier message: 18/12/2002, 10h30

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