2011-02-08 4 views
4

Le projet sur lequel je travaille est confronté à un dilemme de conception sur la façon d'obtenir des objets et des collections d'objets à partir d'une base de données. Il est parfois utile de mettre en mémoire tampon * tous les objets * objets de la base de données avec ses propriétés en mémoire, il est parfois utile de simplement définir un ID objet et interroger ses propriétés à la demande (appel 1 db par objet pour obtenir toutes les propriétés). Et dans de nombreux cas, les collections doivent prendre en charge à la fois la mise en mémoire tampon des objets en mémoire et leur initialisation avec un minimum d'informations pour un accès à la demande. Après tout, tout ne peut pas être mis en mémoire et tout ne peut pas être lu à la demande. C'est un problème de mémoire omniprésent vs IO.Dilemme de conception de couche métier: mémoire ou E/S?

Quelqu'un at-il dû faire face au même problème? Comment a affecté votre conception? Quelles sont les leçons difficiles apprises? D'autres pensées et recommandations?

EDIT: mon projet est un exemple classique d'une DLL de couche de gestion, consommée par une application Web, des services Web et une application de bureau. Lorsqu'une liste de produits est demandée pour une application de bureau et affichée uniquement par nom de produit, cette séquence d'étapes est acceptable pour afficher tous les produits (disons qu'il y a un million de produits dans la base de données):
db appeler pour obtenir tous les noms de produits
2. Un appel db pour obtenir toutes les informations produit si l'utilisateur clique sur le produit pour voir les détails (accès à la demande)

Cependant, si cette même API va être consommée par un service Web pour afficher tous les produits avec des détails, le trafic réseau deviendra bavard. La meilleure séquence dans ce cas serait:
1. Que diable, tampon tous les produits et les champs de produits d'un seul appel db (dans ce cas en mémoire tampon des produits 1 million semble aussi effrayant)

Répondre

6

Cela dépend à quelle fréquence les données changements. Il est courant de mettre en cache des données statiques et quasi statiques (généralement avec une fenêtre d'expiration du cache).

Les bases de données sont déjà conçues pour mettre en cache des données, de sorte que les E/S réseau fournies ne constituent pas un goulot d'étranglement, laissez la base de données faire ce qu'elle sait faire.

Avez-vous examiné certaines des technologies de mise en cache disponibles?

+0

Merci pour les liens! L'article de Velocity était très agréable à lire ... Les données statiques sont déjà mises en cache dans notre cache interne. Les autres données qui ne sont pas statiques ne sont pas du tout mises en cache et ne sont même pas complètement lues dans la mémoire (les champs sont accessibles à la demande, voir la modification). Dans ce cas de données dynamiques, il est difficile de décider si elle doit être lue complètement ou partiellement en mémoire. – kateroh

2

Ce n'est pas un p populaire osition, mais évitez toute mise en cache à moins que ce ne soit absolument nécessaire ou si vous savez immédiatement que vous allez avoir besoin de "l'échelle Internet". Vous avez essayé d'étendre un cache en couches au sommet de la base de données? Allez-vous écrire dans le cache et ne lire ou attendre qu'un objet LRU pour écrire des modifications? que se passe-t-il lorsqu'une autre application ou un niveau de services Web est placé sur la base de données et obtient des lectures incohérentes?

La plupart des bases de données modernes ont déjà un cache et peuvent probablement les implémenter mieux que vous, il suffit de déterminer si vous voulez toucher le câble DB chaque fois que vous avez besoin de quelque chose. Dans la grande majorité des cas, le DB fonctionnera très bien et vous garderez votre cohérence.La théorie de BASE et de CAP est agréable et amusante à discuter et à imaginer, mais parfois, vous ne pouvez pas battre le coût-de-marché juste en touchant la bonne vieille base de données. Stress test et déterminez vos hotspots, implémentez votre cache de manière conservatrice si nécessaire.

+0

merci pour le conseil. le problème d'origine n'est pas seulement une question de cache ou d'accès à la base de données (le projet possède déjà un cache pour les objets changeant moins fréquemment). c'est aussi une question de savoir si les méthodes get-all devraient lire toutes les données en mémoire au lieu de simplement obtenir le minimum de données et retourner le reste à la demande (aussi moins de chances que les données soient périmées) – kateroh

+0

@kateroh - Encore une fois, vous revenez à la même question de cache, qui est que tout peut bien se passer si vous passez TOUJOURS par le cache. Si d'autres couches fournissent des données durables sans invalider le cache, vous obtiendrez des résultats incohérents. Le Web étant (pour la plupart) apatride est souvent une incompatibilité avec les systèmes transactionnels comme celui-ci, mais j'ai été brûlé trop de fois avec l'incohérence du cache et la surcharge de cohérence. – Xailor

+0

@kateroh - Personnellement, KISS it et interrogez votre DB si nécessaire. – Xailor

Questions connexes