Hat DBIx :: Class transparentes Caching?

8

In der C # /. Net-Welt gibt es ORMs wie NHibernate oder ActiveRecord, die transparentes Caching enthalten: Datenbankaktualisierungen werden transparent in den Cache repliziert, Objekte werden direkt aus dem Cache abgerufen, wenn sie verfügbar sind (oft mit Memcached).

Es sieht nicht so aus, als ob transparentes Caching in Perl mit DBIx :: Class verfügbar ist. Habe ich etwas verpasst? Das scheint eine allgemeine Notwendigkeit zu sein, ich bin überrascht, dass ich bei CPAN oder Google nichts darüber finden konnte.

    
Julien 12.08.2009, 18:04
quelle

4 Antworten

6

Halbtransparent gibt es DBIx :: Class :: Cursor :: Cached (von mst, wie DBIC). Sie müssen jedoch ein Cache-Objekt für Ihre Verbindungen oder Schemaobjekte bereitstellen. Scheint leider sehr undokumentiert.

Das Cookbook hat ein Beispiel für die Verwendung von Tie :: Cache auf DBIC, und es gibt auch die (get | set | clear) _cache-Funktionen in DBIx :: Class :: ResultSet, aber sie sind wahrscheinlich nicht genau das, was Sie brauchen .

    
MkV 12.08.2009, 19:04
quelle
5

Hier finden Sie eine einfache Möglichkeit, Caching mit CHI hinzuzufügen. Ich habe das nicht wirklich versucht, also könnte es Fallstricke geben, die ich nicht berücksichtigt habe, insbesondere im Hinblick auf die Serialisierung von DBIC-Ergebnissätzen.

%Vor%

Es ist ein wenig klobig, aber ich denke, es ist ein guter Ausgangspunkt. Wenn Sie diese Art von Vorgang in einer Basisklasse für alle Ihre DBIx :: Class-Tabellenklassen durchführen, sollten Sie in der Lage sein, sehr einfach transparentes Caching zu erstellen.

    
friedo 12.08.2009 19:30
quelle
1

Ich habe das gleiche Problem mit meinem auf DBIx :: Class basierenden Modell gefunden, und nachdem ich die Antworten hier gelesen habe, sehe ich nicht wirklich etwas, das die Lösung ist, nach der ich suche. Nachdem ich mit diesem Problem zu kämpfen habe, fange ich an zu denken, dass meine Business-Schicht das Caching behandeln sollte, so dass ich DBIx :: Class als Persistenzebene behandle, die keine Geschäftslogik implementiert.

Zum Beispiel wäre mein aktueller Code mit idealem Caching etwa so:

%Vor%

Und das $ network-Objekt wird aus dem $ memcached-Cache bedient, den ich während der Konfiguration konfiguriert habe DBIx :: Klassenschema Initialisierung

Der neue Code wäre:

%Vor%

Inzwischen in einem nahegelegenen Modul:

%Vor%

Sie bekommen die Idee.

    
redhotpenguin 05.11.2010 06:13
quelle
0

Ich möchte das hinzufügen, anstatt eine Suchmethode in My::Table hinzuzufügen,

man kann auch die - & gt; -Suchmethode verbessern, die von DBIx::Class::ResultSet zur Verfügung gestellt wird:

%Vor%

Sie können auch sehr wahrscheinlich ResultSet ableiten, so dass Sie diese geänderte (im Cache gespeicherte) Suche allen ResultSets zur Verfügung stellen können, wodurch der Caching-Code für alle Tabellen an einer Stelle bleibt, das wäre viel weniger unordentlich imho.

Dies habe ich aber noch nicht getestet.

Um das obige Beispiel funktionieren zu lassen, fügen Sie es in eine Datei mit dem Namen Ihrer Schemaklasse im Verzeichnis "../Schema/ResultSet/" ein und stellen Sie sicher, dass Ihr Schema.pm "load_namespaces();" enthält, welches alle Ihre überladenen automatisch lädt Klassen, die Sie dort setzen (ich denke, dass meine Catalyst-Installation das automatisch getan hat, aber ich erinnere mich nicht).

DBIx :: Class :: ResultSet

    
bytepusher 31.10.2014 21:18
quelle

Tags und Links