DevTrain

Autor: Hannes Preishuber

Die Lösung für Probleme die wir gar nicht hatten:Datacaching

Um an Daten zu gelangen, befragt man bisher logischerweise die Datenbank. Nur in ganz extremen Fällen lagert man die Daten sozusagen dauerhaft in ein z.B. Array ein. So ist es (hoffentlich) klar, das Maßeinheiten sich nicht dauernd ändern. Insofern ist es ein schlechter Stil die KG und M³ jedesmal per SQl Kommando zu holen. Andererseits sollen diese Werte aber nicht Hardgecoded werden.

Es gibt eine Menge Beispiele wie Bankleitzahlen oder Postleitzahlen die sich praktisch nie ändern. Andere Daten ändern sich eher selten, wie Namen von Personen oder Produktdaten. Hier sind wir auch schon bei unserem Live Beispiel. Artikel aus einem Online Shop (www.toner-online.de) werden bei jedem Request geholt. Dabei sind die Daten über Stunden oder gar Tage immer die gleichen.

Die Lösung ist die Verwendung von Daten Cache. In ASP .NET ist das Cache Objekt eingebaut und kann einfach genutzt werden. Für unsere Zwecke nutzen wir den Cache mit all seinen Möglichkeiten.

Zuweisung eines beliebigen Objekttypes an den Cache.
Wir verwenden ein Dataview, da dieses später per Filter auch Untermengen liefern kann. Das Füllen erfolgt in der Global.asax in der Funktion Application_Start. Beim ersten Aufruf der Anwendung wird also die komplette Tabelle Produkte in den Cache geladen.

Dim DS As DataSet
Dim MyCommand As SqlDataAdapter
Dim MyConnection As SqlConnection
myConnection = New SqlConnection(ConfigurationSettings.AppSettings("DBCon"))
Dim sql As String = "select * from product "
MyCommand = New SqlDataAdapter(sql, MyConnection)
DS = New DataSet()
MyCommand.Fill(DS, "produkte")

Das einfügen des Dataview Objektes in den Cache kann über Insert oder Add verwirklicht werden..
Context.Cache.Add("artikel", DS.Tables("produkte").DefaultView, ...

Lebensdauer des Chache Objektes setzen
Natürlich stimmen die Artikeldaten  nicht immer. Ein Preis kann sich ändern oder ein neues Produkt hinzukommen. Deshalb setzen wir die Lebensdauer des Objektes auf eine Stunde.
Hier verwenden wir die Datetime Klasse und addieren einfach 60 Minuten zur aktuellen Zeit.

Context.Cache.Add("artikel", DS.Tables("produkte").DefaultView, Nothing, DateTime.Now.AddMinutes(60),

Cache.NoSlidingExpiration, ...

Der letzte hier genannte Parameter Sliding oder NonSliding Expiration legt fest, ob Zugriffe die Lebensdauer verlängern (Gleitend). In unserem Fall soll auf alle Fälle nach 60 Minuten der Inhalt verschwinden, also NonSliding.

Automatische Erneuerung der Daten
Nach Ablauf der 60 Minuten soll das Objekt nicht einfach verschwinden. Es muss automatisch erneuert werden. Dazu gibt es als letzten Parameter eine Callbackfunktion die als Delegate definiert wird.

Dim onRemove As CacheItemRemovedCallback 'Public setzen

onRemove = New CacheItemRemovedCallback(AddressOf Me.refreshDS)
Context.Cache.Add("artikel", DS.Tables("produkte").DefaultView, Nothing, DateTime.Now.AddMinutes(60),

Cache.NoSlidingExpiration, CacheItemPriority.High, onRemove)

Die Callback Procedur selbst muss mit den Parametern exakt übereinstimmen. Hier könnten man noch abhängig vom Grund der Cacheexpiration Unterscheidungslogik implementieren. Wir rufen aber einfach wieder die Fill Methode auf.
Public Sub refreshDS(ByVal k As String, ByVal v As Object, ByVal r As CacheItemRemovedReason)
         context.cache("artikel")=getData()
 
End Sub

So könnte z.B. der Speicher nicht mehr für den Cache reichen. Über die Eigenschaft  CacheItemPriority.High sollte das aber zu verhindern sein.


   


Erfasst am: 08.04.2002 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=743
© Copyright 2003 ppedv AG - http://www.ppedv.de