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.
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.
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.
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
);
/*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: