@Cacheable clé sur plusieurs arguments de méthode
De la le printemps de la documentation :
@Cacheable(value="bookCache", key="isbn")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
Comment puis-je spécifier @Cachable
à utiliser isbn
et checkWarehouse
comme clé?
Vous devez vous connecter pour publier un commentaire.
Mise à jour: Courant Printemps cache de la mise en œuvre utilise tous les paramètres de la méthode, comme la clé de cache si non spécifié autrement. Si vous souhaitez utiliser sélectionné touches, reportez-vous à Arjan de réponse qui utilise SpEL liste
{#isbn, #includeUsed}
qui est la façon la plus simple pour créer des clés uniques.De Le Printemps De La Documentation
Avant Le Printemps 4.0
Je vous suggère de concat les valeurs des paramètres dans Spel expression avec quelque chose comme
key="#checkWarehouse.toString() + #isbn.toString()")
, je crois que cela devrait fonctionner comme org.springframework.le cache.l'intercepteur.ExpressionEvaluator renvoie l'Objet, qui est ensuite utilisée comme clé de sorte que vous n'avez pas à fournir uneint
dans votre SPEL expression.Comme pour le code de hachage avec une forte probabilité de collision - vous ne peut pas l'utiliser comme clé.
Quelqu'un dans ce fil a suggéré d'utiliser
T(java.util.Objects).hash(#p0,#p1, #p2)
mais il ne fonctionnera PAS, et cette approche est facile à briser, par exemple, j'ai utilisé les données de SPR-9377 :Les deux lignes d'impression -636517714 sur mon environnement.
P. S. Fait référence dans la documentation, nous avons
Je pense que cet exemple est FAUX et trompeur et devrait être retiré de la documentation, comme les clés doivent être uniques.
P. P. S. voir aussi https://jira.springsource.org/browse/SPR-9036 de quelques idées intéressantes concernant le défaut de génération de clé.
Je tiens à ajouter que pour l'amour de l'exactitude et comme un divertissement fait que l'utilisation d'une sécurité fonction de hachage cryptographique comme SHA256, en raison des propriétés de cette fonction EST possible pour cette tâche, mais pour le calculer à chaque fois peut-être trop cher.
3.1.1
? SPR-9377 a été fixée pour3.1.1
, non? Quelqu'un pourrait ajouter mise à JOUR pour cette réponse?T(someType).hash(#isbn)
travaux au Printemps3.1.1
?{ #root.methodName, #param1, #param2 }
, de toute façon 3.1.1 est l'ancienne version maintenant.Après quelques essais limités avec le Printemps, 3.2, il semble que l'on peut utiliser un SpEL liste:
{..., ..., ...}
. Cela peut également inclurenull
valeurs. Le printemps passe la liste comme la clé de la cache à la mise en œuvre. Lors de l'utilisation de Ehcache, par exemple à un certain point invoquer Le numéro de liste de hashCode(), qui prend tous ses éléments en compte. (Je ne suis pas sûr si Ehcache seulement s'appuie sur le code de hachage.)- Je l'utiliser pour un cache partagé, dans lequel je inclure le nom de la méthode dans la clé ainsi, que le Ressort par défaut du générateur de clés ne comprend pas. De cette façon, je peux facilement effacer le (seul) cache, sans (trop...) de risquer touches correspondantes pour les différentes méthodes. Comme:
Bien sûr, si de nombreuses méthodes ont besoin de cela, et vous êtes toujours à l'aide de tous les paramètres de votre clé, alors, on peut aussi définir un personnalisé générateur de clé qui comprend la classe et le nom de la méthode:
...avec:
{..., ..., ...}
. Dans la actuel de la documentation il est dit que le défaut de génération de clé tiendra compte de tous les paramètres. Donc pas besoin de créerCacheKeyGenerator
.Vous pouvez utiliser un Printemps-EL expression, par exemple, sur JDK 1.7:
@Cacheable(value="books", key="T(someType).hash(#isbn)") public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
-, mais il semble être une fausse et trompeuse exempleCela fonctionne
Utiliser cette