Verteilten Cache mit Datenbank durch Polling synchronisieren

Einleitung

NCache ist eine verteilte Caching-Lösung, die dabei hilft, Ihre Anwendungen zu beschleunigen und gleichzeitig teure Fahrten zur Datenbank zu reduzieren. Dies erhöht wiederum die Skalierbarkeit, da eine große Anzahl von Clients von der Datenbank in den Cache verschoben wird, was zu einer geringeren Belastung Ihrer Datenbank führt und die Notwendigkeit eines Hardware-Upgrades überflüssig macht.

Wenn Daten in einen Cache hinzugefügt werden, platzieren Sie tatsächlich eine Kopie der Originaldaten aus der Datenbank im Cache. Wenn bestimmte Daten in Ihrer Datenbank aktualisiert werden, bleibt ihre Kopie im Cache davon unberührt und wird daher veraltet. Diese Situation tritt jedoch nur auf, wenn mehrere Anwendungen dieselben Daten in der Datenbank aktualisieren, aber nicht alle die Verantwortung für die Aktualisierung der Daten im Cache übernehmen.

In einer solchen Situation, in der einige Anwendungen die Daten in der Datenbank, aber nicht den Cache aktualisieren, benötigen Sie eine Möglichkeit, Ihren Cache mit einer Datenbank zu synchronisieren, sodass sich jede Änderung an den Daten in der Datenbank auch auf die Daten im Cache auswirkt. Dies kann erreicht werden, indem entweder Ereignisbenachrichtigungen aktiviert oder die Datenbank abgefragt wird, um nach Aktualisierungen zu suchen. Wenn Ihre Anwendung jedoch eine der Datenbanken wie SQL Server 2000, eine ältere Version von Oracle oder eine andere OLEDB-kompatible Datenbank verwendet, die keine Ereignisbenachrichtigungen unterstützt, ist die einzige Methode zur Synchronisierung damit die Verwendung von Polling.

Weiter in diesem Artikel werden wir untersuchen, wie NCache synchronisiert den Cache mithilfe von Polling mit einer Datenbank.

Verwenden von DbDependency im Code

Hier ist ein Beispielcode, den Sie in Ihrer Anwendung implementieren müssen, um Ihre Datenbank durch Polling mit dem Cache zu synchronisieren.

String conString = "Provider=OraOLEDB.Oracle;User Id=SYSTEM;" +
"Password=xe;Data Source=xe;OLEDB.NET=true;";

OleDbConnection con = new OleDbConnection(conString);
con.Open();

String sqlCmd = "SELECT ProductID, ProductName FROM dbo.Products WHERE ProductID < 12";

OleDbCommand cmd = new OleDbCommand(sqlCmd,con);
cmd.ExecuteReader();

OleDbDataReader myReader = cmd.ExecuteReader();

List<Products> lstProducts = new List<Products>();
while (myReader.Read())
    {
        Products cProducts = new Products();
        cProducts.ProductID = myReader.GetInt32(0);
        cProducts.ProductName = myReader.GetString(1);
        cProducts.SupplierID = myReader.GetInt32(2);
        cProducts.UnitPrice = myReader.GetDecimal(4);

        CacheItem item = new CacheItem(cProducts);

        DBCacheDependency dependency =
        DBDependencyFactory.CreateOleDbCacheDependency(conString,"");

        _cache.Insert(cProducts.ProductID + ":dbo.Products", cProducts,
        dependency, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
        CacheItemPriority.Default);

        lstProducts.Add(cProducts);
    };
myReader.Close();
con.Close();

Im obigen Code wird eine einzelne Zeile aus der Datenbank geladen und in ein Objekt konvertiert. Später wird CreateOleDbCacheDependency verwendet, um eine Verbindung mit der Datenbank herzustellen und die Zeilen dafür zu registrieren NCache sollte nach Updates suchen. Beachten Sie, dass Sie beim Erstellen einer OleDB-Abhängigkeit mit CreateOleDbCacheDependency dieselbe SQL-Anweisung bereitstellen müssen, die Sie zuvor im Code zum Abrufen der bestimmten Zeile verwendet haben.

Sobald der obige Code implementiert und ausgeführt wurde, wird die NCache wird weiterhin nach jedem angegebenen Bereinigungsintervall zur Datenbank gehen und alle aktualisierten Zeilen abrufen und sie dann durch die entsprechenden abgelaufenen Zeilen im Cache ersetzen.

Datenbank konfigurieren

Wir haben bereits im obigen Code gesehen, wie NCache implementiert die Synchronisation mit der Datenbank. Das Verfahren zum Aktivieren der abfragebasierten Synchronisierung erfordert jedoch einige weitere Schritte, die wir weiter unten sehen werden.

  1. Erstellen Sie eine Tabelle 'ncache_db_sync' in Ihrer Oracle-Datenbank und fügen Sie vier Felder hinzu: (1) cache_key VARCHAR2, (2) cache_id VARCHAR2, (3) modifizierte NUMBER und (4) work_in_progress NUMBER.
  2. Hier ist die SQL zum Erstellen der Tabelle:

    Create table ncache_db_sync
        (
            cache_key varchar2(256) not null enable,
            cache_id varchar2(256) not null enable,
            modified number(2,1) default 0 not null enable,
            work_in_progress number(2,1) default 0 not null enable,
            primary key (cache_key, cache_id) enable
        );
  3. Erstellen Sie UPDATE- und DELETE-Trigger für jede Tabelle, für die eine Benachrichtigung erforderlich ist. Die Trigger werden verwendet, um das 'modifizierte' Feld der entsprechenden Zeile im zu setzen ncache_db_sync-Tabelle auf 1.
  4. /*Here is the SQL to create the trigger:*/
    Create Trigger MyTrigger
    After
    Update [or delete] on dbo.Products
    Referencing OLD AS oldRow
    For each row
     
     Begin
     Update ncache_db_sync
     Set modified = 1
     Where cache_key = (Cast(Select oldRow.ProductID FROM deleted OLD) As VarChar)
    + ':dbo.Products'
    End Trigger;

Hinweis: cache_key muss derselbe Schlüssel sein, der zum Hinzufügen des entsprechenden Datensatzes im Cache verwendet wird.

Die Art und Weise, wie die Auslöser und die 'ncache_db_sync'-Tabelle funktioniert, dass immer dann, wenn ein Wert in der Datenbanktabelle geändert oder gelöscht wird, automatisch der entsprechende Trigger aufgerufen wird. Der Trigger ändert den Wert des Felds „Geändert“ des „ncache_db_sync'-Tabelle auf 1, was anzeigt, dass der Wert des Primärschlüssels geändert wurde.

Das NCache führt nach jedem angegebenen Zeitraum eine Bereinigung abgelaufener und unnötiger Elemente im Cache durch. Dieser Zeitraum wird als Reinigungsintervall bezeichnet. Bei jedem sauberen Intervall wird die NCache sucht auch nach dem Wert des 'modifizierten' Feldes im 'ncache_db_sync'-Tabelle. Wenn der Wert '1' ist, wird die NCache entfernt dann die entsprechenden abgelaufenen Schlüssel aus dem Cache und holt alle aktualisierten Zeilen aus der Datenbank und platziert sie im Cache.

Anmerkungen:

  1. Dies ist eine zeilenbasierte Abhängigkeit. Der Cacheschlüssel ist dem Primärschlüsselwert der Tabelle zugeordnet. Dies bedeutet, dass ein Element nur abläuft, wenn die Zeile mit diesem Primärschlüssel geändert wird.
  2. Der cache_key-Wert muss derselbe sein, der verwendet wurde, um den entsprechenden Datensatz im Cache hinzuzufügen.

Was macht man als nächstes?

© Copyright Alachisoft 2002 - Alle Rechte vorbehalten NCache ist eine eingetragene Marke der Diyatech Corp.