Synchronisieren Sie den verteilten Objektcache mit SQL Server 2008/2012

Autor: Iqbal Khan

NCache ermöglicht es Ihnen, Daten näher an Ihrer Anwendung in der mittleren Ebene zwischenzuspeichern, sodass Sie teure Fahrten zur Datenbank reduzieren können. Dies wiederum beschleunigt Ihre Bewerbung erheblich. Dadurch ist es auch skalierbarer, da die Belastung Ihrer Datenbank reduziert wird und eine größere Anzahl von Clients ohne Hardware-Upgrades verwaltet werden kann.

Wenn Sie jedoch Daten zwischenspeichern, erstellen Sie tatsächlich eine Kopie davon außerhalb Ihrer Datenbank. Dies birgt das Risiko, dass Daten in Ihrer Datenbank geändert werden, Ihre zwischengespeicherte Kopie jedoch unverändert bleibt und veraltet ist. Die gute Nachricht ist, dass diese Situation nur auftritt, wenn mehrere Anwendungen dieselben Daten in der Datenbank ändern und nicht alle den Cache aktualisieren.

Wenn Sie in die Situation geraten, dass andere Anwendungen Daten in der Datenbank ändern und den Cache nicht aktualisieren, benötigen Sie einen Mechanismus, damit sich der Cache direkt mit der Datenbank synchronisieren kann. Dies ist auf verschiedene Arten möglich. Wenn es sich bei Ihrer Datenbank um SQL Server 2008/2012 handelt, kann der Cache .NET-Ereignisbenachrichtigungen für die Synchronisierung verwenden, was sehr effizient ist. Wenn es sich bei Ihrer Datenbank jedoch um SQL Server 2000, Oracle oder eine andere OLEDB-kompatible Datenbank handelt, besteht die einzige Möglichkeit zur Synchronisierung darin, die Datenbank nach Aktualisierungen abzufragen. Diese Methode ist natürlich nicht so effizient, da der Cache am Ende viele unnötige Fahrten zur Datenbank durchführt.

In diesem Artikel werde ich diskutieren, wie NCache Synchronisiert den Cache mithilfe von .NET-Ereignisbenachrichtigungen mit der SQL Server 2008/2012-Datenbank.

Angeben SqlCacheDependency in Code

Folgendes müssen Sie in Ihrem .NET-Anwendungscode angeben, um diese Funktion nutzen zu können. NCache bietet eine Schnittstelle, die der von Microsoft sehr ähnlich ist SqlCacheDependency Schnittstelle, weil intern NCache benutzt SqlCacheDependency Objekt zur Synchronisierung mit SQL Server 2008/2012.

public class Program {

public static void Main(string[] args)
    {
        NCache.InitializeCache("myCache");
        Customer cust = new Customer();
        cust.CustomerID = "ALFKI";
        LoadCustomer(cust);

        List<Customer> custList = FindCustomers("San Francisco");

        // Do your regular work here...

        NCache.Cache.Dispose();
    }

// A standard Load method that loads a single row from database
public Customer LoadCustomer(Customer cust)
    {
        String key = "Customer:CustomerID:" + cust.CustomerID;
        Customer cust2 = (Customer)NCache.Cache.Get(key);
        if (cust2 != null)
        return cust2;

        CustomerFactory custFactory = new CustomerFactory();

        // Load a single customer from the database
        // SELECT * FROM Customers WHERE CustomerID = 'ALFKI'
        custFactory.Load(cust);

        // Create a SqlCacheDependency for this item
        CacheItem item = new CacheItem(cust);
        item.Dependency = SqlDependencyFactory.CreateSqlYukonDependency(connectionString,
        "SELECT CustomerID FROM Customers WHERE CustomerID = '" + cust.CustomerID + "'");

        // Store item in the cache along with SqlCacheDependency
        NCache.Cache.Insert(key, item);
        return cust;
    }

    // A query method
    public List<Customer> FindCustomers(String city)
        {
            String key = "List<Customer>:City:" + city;
            List<Customer> custList = (List<Customer>)NCache.Cache.Get(key);
            if (custList != null)
            return custList;

        CustomerFactory custFactory = new CustomerFactory();

        // Load a list of customers from database based on a criteria
        // SELECT * FROM Customers WHERE City = 'San Francisco'
        custList = custFactory.FindByCity(city);

        // Create a SqlCacheDependency for this list of customers
        CacheItem item = new CacheItem(custList);
        item.Dependency = SqlDependencyFactory.CreateSqlYukonDependency(connectionString,
        "SELECT CustomerID FROM Customers WHERE City = '" + city + "'");

        // Store list of customers in the cache along with SqlCacheDependency
        NCache.Cache.Insert (key, item);
        return custList;
    }
}

Der obige Code zeigt zwei verschiedene Situationen, in denen Sie angeben können SqlCacheDependency. Erstens laden Sie eine einzelne Zeile aus der Datenbank, konvertieren sie in ein Objekt und speichern sie im Cache. Beachten Sie in diesem Fall, dass Sie eine entsprechende SQL-Anweisung angeben müssen, die Sie in Ihrem Code zum Abrufen dieser einzelnen Zeile verwendet haben. Diese SQL-Anweisung wird dann von verwendet SqlCacheDependency Objekt, um eine Verbindung mit der Datenbank herzustellen und die Zeilen zu registrieren, für die SQL Server 2008/2012 .NET-Ereignisbenachrichtigungen senden soll.

Die zweite Situation besteht darin, dass Sie eine Sammlung von Zeilen als Sammlung von Objekten aus der Datenbank abrufen und dann die gesamte Sammlung als einzelnes Objekt im Cache speichern. In diesem Fall müssen Sie eine erstellen SqlCacheDependency das dieselbe SQL-Anweisung verwendet, um dieselben Zeilen aus der Datenbank abzurufen, die Sie gerade erstellt haben. Hier entlang, NCache Benachrichtigt SQL Server 2008/2012, dass eine .NET-Ereignisbenachrichtigung an gesendet werden soll, wenn sich eine dieser Zeilen ändert NCache.

Das obige Codebeispiel deckt die meisten Situationen ab, in denen Sie a angeben müssten SqlCacheDependency in deinem Code. Eine andere Situation ist, wenn Sie versuchen, eine Sammlung verwandter Objekte für den Kunden abzurufen (z. B. 1-n-Beziehung). In dieser Situation machen Sie genau das, was Sie beim Abrufen einer Sammlung von Kundenobjekten getan haben. Das Einzige, was sich ändern würde, ist die SQL-Anweisung, die zum Abrufen verwandter Objekte verwendet wird.

Bitte beachten Sie, dass die von Ihnen angegebene SQL-Anweisung CreateSqlYukonDependency() Methode darf nicht verwendet werden "SELECT * ..." Format. Sie müssen einen oder mehrere Spaltennamen als Teil angeben SELECT Stellungnahme. Ansonsten, SqlCacheDependency wird nicht funktionieren.

Aktivieren Sie Service Broker in SQL Server 2008/2012

Sie müssen den Service Broker zuvor in SQL Server 2008/2012 aktivieren NCache verwenden können, SqlCacheDependency. Dadurch kann SQL Server 2008/2012 Ereignisbenachrichtigungen an senden NCache um ihm mitzuteilen, dass sich Daten in der Datenbank geändert haben.

ALTER DATABASE Northwind SET ENABLE_BROKER;
GO

Bitte beachten Sie, dass NCache ruft automatisch an SqlCacheDependency.Start() Methode aus ihrem eigenen Code heraus. Sie interagieren nie direkt mit SqlCacheDependency und brauchen daher nicht anzurufen "Start()" Methode darauf.

Anwendung ausführen

Sie sind jetzt bereit, Ihre Anwendung auszuführen NCache Aufrufe zum Zwischenspeichern von Daten. Nun, wann immer Sie etwas zwischenspeichern NCache, NCache benachrichtigt SQL Server 2008/2012 darüber und sendet dann, wenn sich diese Daten in SQL Server 2008/2012 ändern, eine .NET-Ereignisbenachrichtigung an NCache. NCache Anschließend werden diese Daten aus dem Cache entfernt, da sie sich in der Datenbank geändert haben. Auf diese Weise findet Ihre Anwendung das nächste Mal, wenn sie diese Daten benötigt, diese nicht im Cache und geht zur Datenbank, um sie abzurufen, und speichert sie dann im Cache.

Zusammenfassung

Wie du gesehen hast, NCache macht es sehr einfach, Ihren verteilten Cache mit Ihrer SQL Server 2008/2012-Datenbank zu synchronisieren. Jetzt können Sie beruhigt sein, da Ihr Cache niemals mit Ihrer Datenbank synchron ist.


Autor: Iqbal Khan arbeitet für Alachisoft , ein führendes Softwareunternehmen, das Lösungen für verteiltes .NET- und Java-Caching, O/R-Mapping und SharePoint-Speicheroptimierung anbietet. Sie erreichen ihn unter iqbal@alachisoft.com €XNUMX.

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