8
votes

DBIX :: La classe a-t-elle une mise en cache transparente?

Dans le monde Net C # /. Il existe des ormes tels que NHibernate ou ActiveRecord qui inclut la mise en cache transparente: les mises à jour de la base de données sont répliquées de manière transparente dans le cache, les objets sont extraits directement du cache lorsqu'ils sont disponibles, etc. (souvent avec memmached).

Il ne ressemble pas à une mise en cache transparente est disponible en Perl avec DBIX :: Classe . Ai-je oublié quelque chose? Cela semble être un besoin commun, je suis surpris de ne rien trouver sur le CPAN ou sur Google.


1 commentaires

Vous obtenez beaucoup de hits pour Google.com/search?q=dbix % 3A% 3Aclass + Caching


4 Réponses :


6
votes

Semi-transparent il y a DBIX :: Classe :: Curseur :: Cachée (de MST, comme Dbic). Vous devez fournir un objet de cache à vos objets de connexion ou de schéma. Semble très non documenté malheureusement.

Le livre de recettes a un exemple d'utilisation de Cravate :: Cache sur DBIC, et il y a aussi la (get | Set | Clear) _Cache Fonctions sur DBIX :: Classe :: Resulats, mais ils ne sont probablement pas exactement ce dont vous avez besoin .


2 commentaires

D'après ce que j'ai compris, il s'agit de la mise en cache pour un cas d'utilisation très limité. Si vous effectuez une recherche et accumulez les articles dans votre recherche à plusieurs reprises, vous pouvez mettre en cache le jeu de résultats. Mais vous ne pouvez pas mettre en cache des objets individuels. Je l'ai testé, dans mon cas, cela ne vous aide pas du tout (je profite effectivement des performances, car je cache le résultat de la recherche, mais l'utiliser une seule fois)


En fait, cela pourrait être une solution. Le problème concerne les relations: les Resultats principaux sont mis en cache, mais pas les relations.



5
votes

Voici un moyen simple que vous puissiez ajouter la mise en cache avec Chi . Je n'ai pas vraiment essayé cela, alors il peut y avoir des pièges que je n'ai pas envisagé, notamment en ce qui concerne la sérialisation des ensembles de résultats 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( @_ );
}


2 commentaires

Merci, ça ressemble à la voie à suivre. J'utilise Catalyst avec Catalyst :: Modèle :: Dbic :: Schema et I Comptent Pas trouvé le bon endroit pour remplacer la méthode de recherche, par exemple: j'ai essayé dans le DBIX :: lass, et dans dbix :: Classe :: Schéma , mais en utilisant $ c-> modèle ('' ') -> la recherche n'utilise pas la nouvelle méthode de recherche


Juste au cas où: la recherche est une méthode de résultat et c'est là que vous devez le remplacer. Par exemple. RESPONDURE RESEAUX :: FOO-> Recherchez ou définissez simplement une classe de résultatsset par défaut lors du chargement du schéma et de l'étendre dans toutes vos classes de résultatssets personnalisées.



1
votes

J'ai rencontré mon même besoin avec mon DBIX :: Modèle basé sur la classe, et après avoir examiné les réponses ici, je ne vois pas vraiment rien de la solution que je recherche. Après avoir lu avec cette question, je commence à penser que ma couche d'entreprise devrait gérer la mise en cache, de sorte que je traite DBIX :: Classe comme une couche de persistance qui ne met pas en œuvre la logique commerciale.

Par exemple, mon code actuel avec La mise en cache idéale serait quelque chose comme ceci: xxx

et l'objet Network $ est servi à partir du cache memmached $ que j'ai configuré pendant DBIX :: Initialisation de schéma de classe

Le nouveau code serait le suivant: xxx

Pendant ce temps, dans un module à proximité: xxx < / Pré>

Vous obtenez l'idée.


0 commentaires

0
votes

Je voudrais ajouter cela, au lieu d'ajouter une méthode de «recherche» dans My :: Table code>,

On peut également améliorer la méthode de recherche fournie par DBIX: : Classe :: ResultatsSet CODE>, comme: P>

package Schema::ResultSet::My::Table;
use base 'DBIx::Class::ResultSet';

sub search {
    my ( $self, $args ) = ( shift, shift );

    # do what you want here with the args passed to ->search
    return $self->next::method( $args, @_ );
}


0 commentaires