gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:01:41 26 4
gpt4 key购买 nike

我有一组相当复杂的 ORM 模块,它们继承自 Class::DBI .由于数据很少更改,我正在考虑在此之上使用缓存/内存层来加快速度。我找到了一个模块: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 方法中使该标志无效 - 这样,如果您真的想要一个新对象,您可以随时检查该标志。

关于perl - 有没有办法为 Class::DBI 缓存机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/757110/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com