Autor:
Hannes Preishuber
Erstellt am:
08 Apr 2002 09:39
|
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.
|
|