我有一组相当复杂的 ORM 模块,它们继承自类别::DBI http://search.cpan.org/dist/Class-DBI。由于数据变化很少,我正在考虑在此之上使用缓存/记忆层来加快速度。我找到了一个模块:类::DBI::可缓存 http://search.cpan.org/dist/Class-DBI-Cacheable但 RT 上没有评级或任何评论。我很高兴收到使用过此或任何其他 Class::DBI 缓存方案的人的来信。
万分感谢。
我也曾多次推出过自己的 ORM,但我不想这么说!如果所有的获取都是通过单个 api(或其子类)进行的,那么缓存/记忆化就非常容易了。
对于任何基于唯一键的获取,您可以仅基于键的串联进行缓存。一个天真的方法可能是:
my %_cache;
sub get_object_from_db {
my ($self, $table, %table_lookup_key) = @_;
# concatenate a unique key for this object
my $cache_key = join('|', map { "$_|$table_lookup_key{$_}" }
sort keys %table_lookup_key
return $_cache{$cache_key}
if exists $_cache{$cache_key};
# otherwise get the object from the db and cache it in the hash
# before returning
}
您可以使用 CPAN 上的 Cache:: 模块套件来代替哈希,在缓存中实现时间和内存限制。
如果您要缓存一段时间,您可能需要考虑一种使缓存中的对象过期的方法。例如,如果您的所有更新也通过 ORM,您可以在 update() ORM 方法中清除(或更新)缓存条目。
需要仔细考虑的最后一点 - 您每次都会返回相同的对象,这会产生影响。例如,如果一段代码检索一个对象并更新一个值,但没有将该更改提交到数据库,则检索该对象的所有其他代码都将看到该更改。如果您将一系列操作串在一起,这可能非常有用 - 它们都可以更新对象,然后您可以在最后提交它 - 但这可能不是您想要的。我通常会在对象刚从数据库中获取时在对象上设置一个标志,然后在您的 setter 方法中,如果对象已更新,则使该标志无效 - 这样,如果您确实想要一个新对象,您可以随时检查该标志。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)