Uploaded image for project: 'Infinispan'
  1. Infinispan
  2. ISPN-3128

Better support for (Spring) read caching

    XMLWordPrintable

Details

    • Enhancement
    • Resolution: Won't Do
    • Major
    • None
    • 5.3.0.Beta2
    • Spring Integration
    • None

    Description

      We're having a bit of an issue using Infinispan as backing cache for Spring's Caching annotations. The reasons are clear, but I haven't found a proper solution yet. I thought I would describe the issues in a feature request, so we can try to make the necessary changes to fix the situation.

      As already described in the forums, an Infinispan cache in invalidation mode sends an invalidation message to other cache nodes if something is put into the cache. This conflicts with Spring's idea of @Cacheable annotations, which are ment to provide read caching for methods. Imagine the following scenario:

      • Method A is annotated with @Cacheable, backed by a cache in invalidation mode
      • Node X calls Method A, the method is executed and the return value is locally cached (and an invalidation message is sent to Node Y)
      • Node Y calls Method A, the method is executed and the return value is locally cached, also, the cache of Node X is invalidated
      • Node X calls Method A and has to execute the method again, since its cache is gone, etc... etc...

      The reason we want to be able to invalidate the read cache, is because if the application executed an update method for the underlying data (usually marked with @CacheEvict or @CachePut) we do want to invalidate the other ndoes.

      In Infinispan, this problem can be solved by caching using cache.putForExternalRead(). That will not invalidate other caches on a put, but will invalidate the cache when asked explicitly. However, simply changing put() to putForExternalRead() in SpringCache leads to a couple of other issues:

      • This is probably not the behaviour everyone wants (people that do not use Spring annotations, but expect the usual Infinispan behaviour).
      • Changing put() to putForExternalRead() would break the expected @CachePut behaviour (a new value is generated, so the old values should be invalidated), but it would fix @Cacheable behaviour.

      Maybe there should be an option in the factory bean to switch between put() and putForExternalRead()? Maybe Spring should change or amend its interface so we can differentiate between calls coming from @CachePut and calls coming from @Cacheable? An other option is to make the invalidation behaviour configurable in Infinispan (that's the way Ehcache handles this issue, you can choose if puts or updates should be replicated, or just replicate invalidations).

      Attachments

        Activity

          People

            slaskawi@redhat.com Sebastian Ɓaskawiec (Inactive)
            miken123-1 Mike Noordermeer (Inactive)
            Votes:
            2 Vote for this issue
            Watchers:
            6 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: