有没有办法为Class :: DBI缓存机制?

有没有办法为Class :: DBI缓存机制?

问题描述:

我有一套相当复杂的ORM模块,从Class::DBI继承。由于数据变化的频率很低,我正在考虑在其上使用Caching/Memoization层来加快速度。我找到了一个模块:Class::DBI::Cacheable,但没有评级或对RT的任何评论。我希望听到有人使用过这个或任何其他Class :: DBI缓存方案。有没有办法为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来实现你的缓存时间和内存限制。

如果您打算缓存一段时间,您可能需要考虑一种将缓存中的对象过期的方法。例如,如果所有更新都通过ORM,则可以在更新()ORM方法中清除(或更新)缓存条目。

最后一点要仔细考虑 - 每次都会返回相同的对象,这会产生影响。例如,如果一段代码检索一个对象并更新一个值,但是没有将该更改提交给该数据库,则检索该对象的所有其他代码将看到该更改。如果你将一系列操作串联在一起,这可能非常有用 - 它们都可以更新对象,然后你可以在最后提交它 - 但它可能不是你想要的。我通常在对象刚从数据库中新建一个标志,然后在你的setter方法中,如果对象被更新,则使该标志无效 - 这样,如果你真的想要一个新的对象,你可以随时检查该标志。

我已经使用memcached之前cache objects,但不是与Class :: DBI(ORM让我觉得脏)。

有几次我们推出了自己的产品,但是我们将其限制在特殊情况下,分析表明我们需要提升(例如大型联接)。由于我们的应用程序通常在DB访问之上使用自定义抽象层(类似于本土ORM),这就是我们实现缓存的地方。我们取得了令人满意的好成绩,并且没有花费很多精力。当然,由于我们没有使用CPAN ORM,我们也没有任何关于使用CPAN缓存模块的选择。

这是严格的个案和选择加入。无论您最终使用CPAN解决方案还是自行开发,最好将其限制为分析表明您需要帮助的情况,并确保它是可选的,以便您的缓存不会以微妙的方式破坏您的应用程序当你没有想到它会活跃时。