OpenERP缓存功能
我想在我的OpenERP模块中缓存一些结果,所以我查了一下,发现了缓存装饰器。可惜的是,我找到的文档大部分只是在类的声明里:
把它当作你想要缓存的函数的装饰器来使用。超时设置:0表示没有超时,其他值以秒为单位。
有没有人能推荐一个好的使用示例?有没有什么已知的问题需要避免的?
2 个回答
3
现在这个缓存更好用了,因为它采用了LRU(最近最少使用)策略,而不是一个无限的缓存了。
http://bazaar.launchpad.net/~openerp/openobject-server/5.0/revision/2151
看起来默认情况下,这个方法的前两个参数在缓存时会被忽略(通常是游标和用户ID)。
- 你可以通过传递skiparg参数来修改这个行为。
- 被忽略的参数是隐式传递的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)。
这些都是我浏览代码后得到的初步理解。如果有实际使用过的人,欢迎分享一下反馈。