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 :

Création d'un cache, mise en cache de donnée indexé


Sujet :

Persistance des données Java

  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut Création d'un cache, mise en cache de donnée indexé
    Hello,

    Dans mon application j'aimerais mettre en cache des données qui sont récupérés de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    	public List<CategoryDb> findByIndex(int index, int max, String lang) {
    		logger.info("Find all categories Begin");
    		List<CategoryDb> result = new ArrayList<CategoryDb>();
    		Connection connection = DbUtils.getInstance();
    		try {
    			connection.setAutoCommit(false);
    			PreparedStatement  stmt = connection.prepareStatement("SELECT DISTINCT (id_category), text FROM category" + "_" + lang + " ORDER BY id_category  LIMIT ? OFFSET ? ");
    			stmt.setInt(1, max);
    			stmt.setInt(2, index);
    			ResultSet rs = stmt.executeQuery();
    			connection.commit();
    			while (rs.next()) { 
    				CategoryDb category = new CategoryDb();
    				category.setIdCategory(rs.getInt("id_category"));
    				category.setText(rs.getString("text"));
    				result.add (category);
    			}
    		}catch (SQLException ex) {
    			logger.error("Find all categories End");
    		}
    		return result;				
    	}
    Comment indexé la liste pour la mettre en cache ?

    J ai deja un systeme de cache que j utilise comme ceci, pour l instanciation et l utilisation de méthodes qui ne demandent pas d index

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    public synchronized static CategoryDAO getInstance(String langCode) {
    		lang = langCode;
    		if (instance == null)
    			instance = new CategoryDAO();
    		if (cache == null) {
    			cache = new Hashtable<String, CategoryDb>();
    			sortedCache = new Hashtable<String, CategoryDb>();
    		}
    		if (cache.size() == 0)
    			load(lang);		
     
    		return instance;
    	}
     
    	/**
             * Load cache.
             *
             */
    	public static void load(String lang) {
    		logger.info("Load lang cache Begin ");
    		Connection connection = DbUtils.getInstance();
    		try {
    			connection.setAutoCommit(false);
    			PreparedStatement  stmt = connection.prepareStatement("SELECT id_category, text FROM category" + "_" + lang + " ORDER BY id_category");
    			ResultSet rs = stmt.executeQuery();
    			connection.commit();
    			while (rs.next()) {
    				CategoryDb category =  new CategoryDb();
    				category.setIdCategory(rs.getInt("id_category"));
    				category.setText(rs.getString("text"));
    			    // sorted keys output  thanks to T. GUIRADO for the tip!
    				cache.put(String.valueOf(category.getIdCategory()) + "-" + String.valueOf(lang),category);
    				Vector v = new Vector(cache.keySet());
    			    Iterator it = cache.keySet().iterator();
    			    Collections.sort(v);
    			    it = v.iterator();
    			    while (it.hasNext()) {
    			       String key =  (String)it.next();
    			       sortedCache.put(key, (CategoryDb)cache.get(key));
    			    }				
    			}		
    		}catch (SQLException ex) {
    			logger.error("SQL Exception" + ex);
    			try {
    				connection.rollback();
    			}catch (SQLException exRollback) {
    				logger.error("SQL Exception when rolling back" + ex);
    			}
    		}
    		finally {
    			try {
    				connection.close();
    			}catch (SQLException ex) {
    				logger.error("Close connection Exception" + ex);
    			}
    		}
    		logger.info("Update message End");
    	}
     
    /**
             * Return the whole list of CategoryDb entity.
             * 
             * @return
             */
    	public List<CategoryDb> findAllByLang(String lang) {
    		logger.info("Find all categories Begin");
    		List<CategoryDb> result = new ArrayList<CategoryDb>();
    		Vector v = new Vector(cache.keySet());
    	    Iterator it = cache.keySet().iterator();
    	    Collections.sort(v);
    	    it = v.iterator();
    	    if (cache.size() > 0) {
    	    while (it.hasNext()) {
    	       String key =  (String)it.next();
    	       result.add(sortedCache.get(key));
    	    }
    	    }else {
    			Connection connection = DbUtils.getInstance();
    			try {
    				connection.setAutoCommit(false);
    				PreparedStatement  stmt = connection.prepareStatement("SELECT category.id_category, category.text FROM category" + "_" + lang + " ORDER BY id_category");
    				ResultSet rs = stmt.executeQuery();
    				connection.commit();
    				while (rs.next()) { 
    					CategoryDb category = new CategoryDb();
    					category.setIdCategory(rs.getInt("id_category"));
    					category.setText(rs.getString("text"));
    					result.add (category);
    				}
    			}catch (SQLException ex) {
    				logger.error("Find all categories End");
    			}
    		}
    		return result;		
     
    	}
    Merci de vos lumières.

  2. #2
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Je ne comprends pas très bien ce que tu veux faire.

    S'il s'agit d'indexer par rapport à une base de données, pourquoi n'utilises-tu pas un id, qui semble déjà exister dans ta base ?
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut
    c'est deja ce que je fais mais le but est d empecher l execution de la requete sur la base de donnée

    donc de récupéré les résultats de x à y demanderaint d ajouter un tableausur le cache (hashtable) la clef serait l index et le max pas tres concluant comme résultat

    ca donnerait un truc Hashtable[String,Array[Object]]

  4. #4
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Ah ! Tu voudrais que la clef exprime la plage sauvegardée dans le ArrayList, et comme ça, former une HashMap avec plusieurs plages de valeurs ?
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut
    exactement ! comme ca je pourrais navigué dans cette hashmap a l aide de deux index, index et max

    ca permet d avoir en mémoire les éléments de facon indexés sans devoir charger toute la structure en mémoire (a part si tous les index ont été browsé)

    mais ca me semble un peu complexe à mettre en place et à utilisé

  6. #6
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Oui... d'où mes questions

    Je te conseille, soit de mettre en place un HashMap simplement indexé par le id, soit de te plonger dans les nombreuses solutions qui existent déjà à ce sujet, soit... de ne rien faire : si ton moteur de base de données ou ton driver JDBC est bon, il fait tout ça tout seul.
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut
    je vais me contenter de mon cache simple avec les id d ailleurs ehcache fait pareil ....

Discussions similaires

  1. [Forum] Mise en cache
    Par Jukien dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 16/08/2006, 15h41
  2. Empêcher la mise en cache
    Par Huntress dans le forum Langage
    Réponses: 4
    Dernier message: 30/03/2006, 11h54
  3. Mise en cache d'une page
    Par clad523 dans le forum ASP
    Réponses: 1
    Dernier message: 06/03/2006, 11h44
  4. Empêcher la mise en cache des images
    Par oranoutan dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 15/02/2006, 11h49
  5. mise en cache du navigateur
    Par littleqi dans le forum ASP
    Réponses: 4
    Dernier message: 03/06/2005, 15h18

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