6
votes

Java Dao Caching

Je développe une application Java moyenne et je suis confronté à un petit problème en raison de mon manque d'expérience.

J'ai un DAO personnalisé, qui obtient des objets "Article" de la base de données. J'ai la classe , et la DAO a une méthode appelée getarticle (int ID) , cette méthode renvoie un article . L'article comporte une catégorie , et j'utilise le chargement paresseux.

Ainsi, lorsque je demande une catégorie d'un article ( article A = nouvel article (); A.GetCategory (); ) L'article Classe Obtient le Catégorie du DAO puis le renvoie.

Je pense maintenant à le mettre en cache, alors lorsque je demande plusieurs fois à la catégorie d'un article, la base de données est uniquement interrogée une fois.

Ma question est la suivante: où devrais-je mettre ce cache? Je peux le mettre sur la catégorie (dans la DTO) ou je peux le mettre sur la classe DAO.

Que dites-vous?


0 commentaires

5 Réponses :


8
votes

Avez-vous envisagé d'utiliser hibernate ?


2 commentaires

Exactement, pas besoin de réinventer la roue. Cela pourrait être un exercice amusant de mettre en œuvre une sorte de cache vous-même, mais si vous voulez simplement obtenir la demande de travail, allez avec Hibernate. Il dispose de facilités pour gérer la mise en cache pour vous automatiquement, et vous allez reprendre une expérience précieuse avec un cadre Orm standard de l'industrie pendant que vous y êtes.


Si vous proposez une solution pré-fabriquée, je pense qu'il est bon d'expliquer brièvement comment cela fonctionne avec la question initiale, dans ce cas, la mise en cache des données. Voir ma réponse.



3
votes

Le but de la DAO est de résumer le mécanisme de persistance. Depuis "où" la catégorie provient de (dB, fichier sur disque, prise réseau, cache) fait partie de ce mécanisme de persistance, le DAO devrait "masquer" l'objet le consommant.


0 commentaires

0
votes

Cela dépend de si votre article la seule classe pour accéder directement à la DAO ou non.

Personnellement, je voudrais mettre en œuvre la mise en cache dans article pour le simple fait que tout le monde n'utilisera pas le DAO souhaitera la mise en cache. Aussi d'un point de vue d'avoir une seule classe faire une chose et une chose seulement, puisque vous avez déjà le chargement paresseux dans article , il ne serait pas logique de déplacer ensuite une partie du chargement de la façon dont le chargement se produit dans le DAO


0 commentaires

3
votes

envisagez d'utiliser Hibernate ou même la forme plus simple de celle-ci (JPA)


0 commentaires

9
votes

Ma question est: Où devrais-je mettre cette cache? Je peux le mettre sur le Classe d'articles (dans le DTO), ou je peux Mettez-le sur la classe DAO. P>

Comme les autres ont mentionné, cela sonne bien un peu comme réinventer la roue. Mais considérons les deux cas de toute façon, afin que vous amélioriez une meilleure compréhension de la façon dont ORM fonctionne. P>

Si vous stockez la catégorie dans l'article fort>, la même catégorie sera chargée à nouveau et Encore une fois si accessible par différents articles. p> xxx pré>

si vous stockez dans le DAO fort>, tous les articles de la même catégorie profiteront au cache, mais Vous devez prendre soin de mettre à jour le cache également lorsque la catégorie est modifiée. P>

saveCategory( Category c ) {
     cache.put( c.id, c ); 
     <save in database>
}


1 commentaires

Merci mec, c'est une réponse vraiment architecte. Je sais hibernate, j'utilise JPA en fait, mais j'ai utilisé Hibernate. J'essaie de le faire par moi-même, comme un hobbie. Je pense que je vais utiliser l'entité et le cache de 2e niveau, avec certains observateurs et délais d'attente. Merci encore frère!