2010-07-05 19 views
3

Je souhaite mettre en cache des résultats dans mon module OpenERP, j'ai donc creusé un peu et trouvé the cache decorator. Malheureusement, la plupart des documents que je suis en mesure de trouver est dans la déclaration de classe:Fonctions de cache OpenERP

utiliser comme décorateur de la fonction que vous envisagez de mettre en cache Délai d'attente: 0 = pas de délai d'attente, sinon en quelques secondes

Quelqu'un peut-il recommander un bon exemple de comment l'utiliser? Y a-t-il des problèmes connus à éviter?

+0

Dans 7.0 (pas sûr d'autres) les paramètres 'multi' et' timeout' sont ignorés. En outre, le passage d'un 'skiparg' inférieur à' 2' donnera des résultats indésirables. –

Répondre

5

Après avoir creusé autour un peu plus, l'exemple le plus simple que j'ai trouvé est le ir_model_data._get_id() method:

@tools.cache() 
def _get_id(self, cr, uid, module, xml_id): 
    ids = self.search(cr, uid, [('module','=',module),('name','=', xml_id)]) 
    if not ids: 
     raise ValueError('No references to %s.%s' % (module, xml_id)) 
    # the sql constraints ensure us we have only one result 
    return ids[0] 

Il semble que vous venez de choisir une méthode de modèle que vous souhaitez mettre en cache, puis ajoutez le cache comme a decorator. Si certains événements doivent vider le cache comme this update() method, vous utilisez la méthode mises en cache comme un objet de cache:

  if not result3: 
       self._get_id.clear_cache(cr.dbname, uid, module, xml_id) 

Il ressemble par défaut, les deux premiers paramètres de la méthode sont ignorés lors de la mise en cache (curseur et ID utilisateur la plupart des cas).

Tout cela est basé sur l'écrémage du code. J'aimerais entendre les commentaires de tous ceux qui l'utilisent.

3

Le cache est actuellement plus utilisable puisqu'il s'agit de LRU et non plus d'un cache infini.

http://bazaar.launchpad.net/~openerp/openobject-server/5.0/revision/2151

Il ressemble par défaut, les premiers deux paramètres de la méthode sont ignorés lorsque la mise en cache (curseur et utilisateur id dans la plupart des cas).

  1. ceci peut être modifié par le paramètre de passage
  2. les arguments sautés sont le soi et le curseur implicitement passé. L'ID utilisateur est utilisé dans la mise en cache lorsque le skiparg est 2.