2009-05-07 6 views
2

J'ai travaillé sur un projet complexe en utilisant une application distribuée qui nécessite la mise en cache de requêtes SQL: depuis que j'utilise iBatis framework, j'aimerais utiliser memcached - sysadmin l'exige - en tant que moteur de cache. Est-ce possible? Si oui, est-ce que quelqu'un connaît les solutions/implémentations existantes? Je sais déjà que OSCACHE fonctionne également en cluster, mais j'aimerais savoir si l'utilisation de l'architecture existante est possible, avant de passer à une nouvelle. Merci beaucoup d'avance !!!Est-il possible d'injecter memcached dans Apache iBatis?

Répondre

1

Question intéressante! IBatis renvoie un ou plusieurs JavaBeans, qui peuvent à leur tour contenir des listes imbriquées de JavaBeans. Un JavaBean est juste un objet Java qui adhère à certains conventions simples, dont l'un est qu'il implémente l'interface Serializable. Si c'est le cas, vous pouvez serialize une structure JavaBean dans une chaîne et désérialiser cette chaîne dans une copie complète de la structure JavaBean d'origine. Supposons que vous vous assuriez que tous vos objets de résultat sont déclarés "implémentables Serializable". Les JavaBeans ont une structure si simple que les mécanismes de sérialisation/désérialisation des objets Java par défaut n'ont pas besoin d'être remplacés, ce qui est bien.

Ces chaînes sérialisées sont les valeurs que vous avez placées dans la mappe de hachage distribuée de votre cluster memcached. Dans chacune de vos méthodes Java qui exécute une requête et retourne ses résultats, vous recherchez d'abord le résultat existant dans memcached, et si est là et n'a pas expiré, vous le désérialisez dans les JavaBeans que (probablement) votre requête sont retournés. Si le résultat de la requête est et non trouvé dans memcached, vous interrogez la base de données via iBatis, mais avant de renvoyer le résultat, vous le sérialisez dans une chaîne et stockez cette valeur dans memcached.

La question suivante est de savoir quoi utiliser pour le résultat de la requête memcached touches. Quelque chose comme

YourIbatisQueryName + ":" + FirstParameterValue + ":" + SecondParameterValue 

devrait fonctionner (par exemple, "SelectStackOverflowReputation: Simone: Tripodi").

Vous avez presque terminé. La dernière étape consiste à déterminer combien de temps un résultat de requête peut être mis en cache sans devenir invalide. Vous pouvez peut-être définir un délai d'expiration différent pour chaque requête, ou vous avez peut-être besoin d'un mécanisme d'invalidation manuelle du cache. La mise en cache des résultats de la requête même pour quelques minutes peut avoir des effets très importants sur l'évolutivité de votre application.

Remarque: Une variante de cette approche consiste à ne pas utiliser la sérialisation Java par défaut, mais à utiliser XML ou JSON ou un autre format. Si vous choisissez XML ou JSON, examinez un framework de sérialisation tel que XStream pour sérialiser/désérialiser vos JavaBeans en XML Strings et revenir en arrière.

0

étend cacheController, mais alias utiliser ajouter global

+0

Pouvez-vous modifier votre réponse pour être plus précis sur les actions nécessaires. – Lipongo