2009-04-07 7 views
1

J'utilise la technique suivante pour mettre en cache certains appels à ma base de données - cette fonction réside dans mon référentiel.mise en cache très simple - est-ce un o.k. technique?

Public Shared Function GetByStoreURL(ByVal StoreURL As String) As Model.Partner 

     Dim key As String = StoreURL 
     If Current.Cache(key) Is Nothing Then 
      Dim objPartner = Model.DB.Select().From(Tables.Partner).Where(Partner.Columns.StoreURL).IsEqualTo(StoreURL.ToString).And(Partner.Columns.IsDeleted).IsNotEqualTo(1).ExecuteSingle(Of Partner)() 
      Current.Cache.Add(key, objPartner, Nothing, Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(60), CacheItemPriority.NotRemovable, Nothing) 
     End If 

     Return DirectCast(Current.Cache(key), Model.Partner) 

    End Function 

Cette technique est-elle défectueuse? semble si simple et semble avoir fonctionné très bien.

Répondre

3

Le seul problème est si vous voulez invalider le cache (en raison de la modification des données) et que vous utilisez sur un environnement de charge équilibrée/cluster. Si c'est une possibilité alors vous pouvez ajouter une dépendance de fichier, ou regarder un système de mise en cache distribué comme Velocity.

Si vous n'avez pas besoin de le faire, vous ne pas à l'échelle, et vous ne me dérange pas d'avoir potentiellement des documents « périmés » c'est très bien :-)

+0

ouais les choses que je cache peuvent être périmées – Slee

1

En fait, beaucoup de choses mal ici avec la violation la plus évidente d'un Single responsibility principle. Fondamentalement, votre fonction devrait faire une seule tâche strictement définie (c'est-à-dire, récupérer un Partner de la base de données).

Ensuite va le multithreading. Les sites Web sont intrinsèquement multithread, donc cela devrait être pris en compte. Plus précisément, un élément peut être retiré du cache entre les appels If Current.Cache(key) Is Nothing et Return DirectCast(Current.Cache(key), Model.Partner). Le verrouillage est nécessaire pour résoudre ce problème, mais cela enflammera encore plus la fonction (voir le premier paragraphe).

En outre, l'élément peut être ajouté au cache pendant l'exécution de votre code de base de données. Cela entraînera une erreur, puisque Cache.Add n'écrase pas les valeurs avec la même clé, qui sera déjà là (pensez au multithreading).

Et enfin je remets en question l'unicité d'un StoreURL.