当前位置:  开发笔记 > 编程语言 > 正文

DBIx :: Class是否具有透明缓存?

如何解决《DBIx::Class是否具有透明缓存?》经验,为你挑选了2个好方法。

在C#/ .Net世界中,有一些ORM,如NHibernate或ActiveRecord,包括透明缓存:数据库更新透明地复制到缓存,对象在可用时直接从缓存中检索等(通常使用memcached).

在带有DBIx :: Class的 Perl中,它看起来不像透明缓存.我错过了什么?这似乎是一个普遍的需求,我很惊讶我在CPAN或谷歌上找不到任何东西.



1> MkV..:

半透明地有DBIx :: Class :: Cursor :: Cached(来自mst,如DBIC).您需要为连接或模式对象提供Cache对象.遗憾的是,似乎没有证据.

Cookbook确实有一个在DBIC上使用Tie :: Cache的例子,在DBIx :: Class :: ResultSet上也有(get | set | clear)_cache函数,但它们可能不是你需要的.



2> friedo..:

这是一种可以使用CHI添加缓存的简单方法.我实际上没有尝试过这个,所以可能有一些我没有考虑过的陷阱,特别是关于DBIC结果集的序列化.

package My::Table;
use strict; 
use warnings;

use base 'DBIx::Class';

use Storable 'freeze';
use CHI;

$Storable::canonical = 1;

__PACKAGE__->load_components(qw/Core/);
__PACKAGE__->table('mytable');

# ....

my $CACHE = CHI->new( driver => 'Memory' );

sub search { 
    my $self = shift;

    my $key = freeze( \@_ );      # make cache key from params
    if ( my $rs = $CACHE->get( $key ) ) { 
        return $rs;
    }

    # Note: there are issues with context propagation here
    my $rs = $self->next::method( @_ );
    $CACHE->set( $key => $rs );
    return $rs;
}

sub update { 
    my $self = shift;

    my @keys = $self->find_all_cache_items_affected_by_this_update( @_ );
    $CACHE->remove( $_ ) for @keys;

    $self->next::method( @_ );
}

它有点笨重,但我认为这是一个很好的起点.如果在所有DBIx :: Class表类的基类中执行此类操作,则应该能够非常轻松地构建透明缓存.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有