NCache ist ein extrem schneller und linear skalierbarer verteilter Cache, mit dem Sie Anwendungen zwischenspeichern können, um Ihre Anwendungsleistung zu verbessern. Wenn Sie Anwendungsdaten zwischenspeichern, erstellen Sie eine Kopie der Daten im Cache, die auch in Ihrer Datenbank vorhanden ist. Wenn sich diese Daten in der Datenbank ändern, möchten Sie sicherstellen, dass der Cache ebenfalls aktualisiert wird, damit er immer mit der Datenbank konsistent ist.
Um mit dieser Situation umzugehen, NCache bietet leistungsstarke Datenbanksynchronisierungsfunktionen, bei denen sich der Cache selbst synchronisiert, wenn sich Daten in relationaler oder relationaler Form ändern NoSQL database. Synchronisierung bedeutet hier, das entsprechende zwischengespeicherte Element aus dem Cache zu entfernen (oder es mit Durchlesen neu zu laden). NCache bietet Folgendes für die Datenbanksynchronisierung:
Das folgende Diagramm zeigt die grundlegende Architektur von how NCache unterstützt die Datenbanksynchronisation:
SQL-Abhängigkeit wird verwendet von NCache falls Ihre Datenbank SQL Server ist. Sie können eine SqlDependency für jedes zwischengespeicherte Element angeben, wenn Sie es im Cache hinzufügen oder aktualisieren. SQL Server überwacht das Dataset auf Hinzufügungen, Aktualisierungen oder Entfernungen und benachrichtigt es NCache durch SQL-Benachrichtigungen fast unmittelbar nach der Datenbankaktualisierung. Dies sind Datenbankbenachrichtigungen, die in .NET-Ereignisse umgewandelt werden.
SqlDependency kann eine der folgenden sein:
Mehr Details zu diesem Thema finden Sie im Blog Cache mit SQL Server synchronisieren.
So können Sie SqlDependency in Ihrem .NET-Code mit dynamischen parametrisierten Abfragen verwenden:
string connString = ConfigurationManager.AppSettings["connectionString"];
string query = "SELECT ProductID, ProductName, UnitPrice FROM Products WHERE ProductID > @productID";
...
var param = new SqlCmdParams();
...
sqlCmdParam.Add("@productID", param);
SqlCacheDependency sqlDepenency = new SqlCacheDependency(connString, query, SqlCommandType.Text, sqlCmdParam);
So können Sie SqlDependency in Ihrem .NET-Code mit gespeicherten Prozeduren verwenden:
...
var param = new SqlCmdParams();
...
sqlCmdParam.Add("productID", param);
SqlCacheDependency sqlDependency = new SqlCacheDependency(connString, "sp_GetProductByID", SqlCommandType.StoredProcedure, sqlCmdParams);
OracleAbhängigkeit wird verwendet von NCache falls Ihre Datenbank Oracle 10g oder höher ist und entweder unter Windows oder Unix läuft. Genau wie bei SqlDependency können Sie OracleDependency für jedes zwischengespeicherte Element angeben, wenn Sie es im Cache hinzufügen oder aktualisieren.
OracleDependency kann eine der folgenden sein:
Oracle Server überwacht diesen Datensatz dann auf Hinzufügungen, Aktualisierungen oder Entfernungen und benachrichtigt ihn, wenn dies geschieht NCache durch Oracle-Benachrichtigungen fast unmittelbar nach der Datenbankaktualisierung. Diese Benachrichtigungen verwenden die darunter liegende Client/Server-Kommunikation von Oracle und sprechen mit NCache über .NET.
So können Sie OracleDependency in Ihrem .NET-Code mit dynamischen parametrisierten Abfragen verwenden:
...
var param = new OracleCmdParams();
. . .
oracleParam.Add("productID", param);
OracleCacheDependency oracleDepenency = new OracleCacheDependency(connString, query, OracleCommandType.Text, oracleParam);
Sie können parametrisierte gespeicherte Prozeduraufrufe in Oracle-Abhängigkeit wie hier gezeigt verwenden:
...
OracleCmdParams param = new OracleCmdParams();
. . .
oracleParam.Add("productID", param);
OracleCacheDependency oracleDependency = new OracleCacheDependency(connString, "sp_GetProductByID", OracleCommandType.StoredProcedure, oracleParam);
NCache bietet auch mehr Flexibilität und Kontrolle darüber, wie und wann eine Abhängigkeit von einem Cache-Element aufgerufen werden soll. Erweiterbare Benachrichtigungsabhängigkeit ermöglicht es Ihnen, Ihre benutzerdefinierte Logik zu implementieren, die angibt, wann Daten aus dem Cache entfernt werden sollen. Sie können Ihren benutzerdefinierten Anbieter für Ihre zugrunde liegende Datenbank wie Cosmos DB und MongoDB schreiben, und dieser Anbieter wird im Cache bereitgestellt. Der Cache überprüft dann alle bereitgestellten Abhängigkeiten, ob sie entfernt werden müssen oder nicht.
Sie können Ihren benutzerdefinierten Anbieter erstellen und im Cache bereitstellen, um benutzerdefinierte Abhängigkeiten in Ihrer Anwendung zu verwenden. Der folgende Codeausschnitt zeigt, wie ein bereitgestellter benutzerdefinierter Anbieter für die Cosmos DB-Synchronisierung in Ihrem .NET-Code verwendet werden kann, während Elemente zum Cache hinzugefügt werden:
Customer customer = LoadCustomerFromDB(customerId);
CacheDependency cosmosDbDependency = new CosmosDbNotificationDependency<Customer>(. . .) ;
var cacheItem = new CacheItem(customer);
cacheItem.Dependency = cosmosDbDependency;
cache.Insert("Customer:" + customer.Id, cacheItem);
OleDB-Abhängigkeit OleDB-Abhängigkeit wird verwendet von NCache für den Fall, dass Ihre Datenbank weder SQL Server noch Oracle ist, sondern eine OLEDB-kompatible Datenbank. Sie können DbDependency auch mit SQL Server und Oracle verwenden, wenn Sie deren Ereignisbenachrichtigungen nicht möchten, die bei sehr schnellen Datenänderungen zu Gesprächen führen könnten.
In DbDependency erstellen Sie eine Tabelle mit dem Namen ncache_db_sync in der Datenbank, die eine Zeile für jedes zwischengespeicherte Element mit DbDependency enthält. Sie ändern Ihre Datenbank-Trigger, um Zeilen in dieser Tabelle zu aktualisieren, wenn sich die entsprechenden Daten in der Datenbank ändern. NCache fragt diese Tabelle nach aktualisierten Zeilen ab, also in einer Abfrage, NCache ruft Tausende von Zeilen ab und synchronisiert sie mit der Datenbank.
So können Sie DbDependency in Ihrem .NET-Code verwenden.
DBCacheDependency oledbDependency = DBDependencyFactory.CreateOleDbCacheDependency(connectionString, "PrimaryKey:dbo.Products");
var cacheItem = new CacheItem(product);
cacheItem.Dependency = oledbDependency;
cache.Insert(key, cacheItem);
Wenn Sie eine sehr große Anzahl von Elementen im Cache haben und alle mit der Datenbank synchronisiert werden müssen, ist es viel besser, eine zu schreiben CLR-Verfahren in SQL Server unter Windows. Diese CLR-Prozedur wird von Ihren Datenbank-Triggern aufgerufen, wenn sich die relevanten Daten ändern. Diese CLR-Prozedur macht dann asynchron NCache API-Aufrufe zum Hinzufügen, Aktualisieren oder Entfernen des entsprechenden zwischengespeicherten Elements aus dem Cache.
Hier ist ein Beispiel für eine CLR-Prozedur, die das Objekt entfernt, wenn es aktualisiert wird.
[Microsoft.SqlServer.Server.SqlProcedure]
public static void RemoveOnUpdate(string cacheName, string key)
{
cacheName = "demoClusteredCache";
Cache cache = CacheManager.GetCache(cacheName);
cache.RemoveAsync(key);
}
Das Standardverhalten der Datenbanksynchronisierung besteht darin, das zwischengespeicherte Element aus der Datenbank zu entfernen, wenn sich die entsprechenden Daten in der Datenbank ändern. Es gibt jedoch Situationen, in denen Sie es einfach mit der neuesten Version der Daten aktualisieren möchten.
Um diesem Bedarf gerecht zu werden, NCache ermöglicht es Ihnen, die Datenbanksynchronisierung mit der zu kombinieren Durchlesen Handler-Funktion von NCache. Mit diesem, NCache Ruft einfach den Read-Through-Handler auf, um die neueste Kopie des zwischengespeicherten Elements neu zu laden, und aktualisiert dann den Cache damit. Diese Funktion bietet die Flexibilität zum Synchronisieren NCache mit einem relationalen oder NoSQL database die konfiguriert wurde, einschließlich der folgenden (und mehr):
Das folgende Code-Snippet zeigt, wie Daten in großen Mengen automatisch neu geladen werden können NCache von Cosmos DB mit Read-Through. Weitere Details finden Sie auch im Blog Cache mit CosmosDB synchronisieren.
public Task ProcessChangesAsync(IChangeFeedObserverContext context, IReadOnlyList docs, CancellationToken cancellationToken)
{
cacheItems = cache.GetBulk(DocsKeys, new ReadThruOptions {Mode = ReadMode.ReadThruForced} );
return Task.CompletedTask;
}