OpenERP缓存功能

3 投票
2 回答
3020 浏览
提问于 2025-04-16 00:51

我想在我的OpenERP模块中缓存一些结果,所以我查了一下,发现了缓存装饰器。可惜的是,我找到的文档大部分只是在类的声明里:

把它当作你想要缓存的函数的装饰器来使用。超时设置:0表示没有超时,其他值以秒为单位。

有没有人能推荐一个好的使用示例?有没有什么已知的问题需要避免的?

2 个回答

3

现在这个缓存更好用了,因为它采用了LRU(最近最少使用)策略,而不是一个无限的缓存了。

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

看起来默认情况下,这个方法的前两个参数在缓存时会被忽略(通常是游标和用户ID)。

  1. 你可以通过传递skiparg参数来修改这个行为。
  2. 被忽略的参数是隐式传递的self和游标。当skiparg为2时,用户ID会被用于缓存。
5

经过进一步的探索,我发现最简单的例子是 ir_model_data._get_id() 方法

@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]

看起来你只需要选择一个想要缓存的模型方法,然后把缓存作为 装饰器 添加上去。如果有些事件需要清除缓存,比如 这个 update() 方法,你就可以把缓存的方法当作缓存对象来使用:

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

看起来默认情况下,方法的前两个参数在缓存时会被忽略(大多数情况下是游标和用户 ID)。

这些都是我浏览代码后得到的初步理解。如果有实际使用过的人,欢迎分享一下反馈。

撰写回答