Chapter 1. Using Data Grid as a Spring Cache provider
Add Data Grid dependencies to your application and use Spring Cache annotations to store data in embedded or remote caches.
1.1. Setting up Spring caching with Data Grid
Add the Data Grid dependencies to your Spring application project. If you use remote caches in a Data Grid Server deployment, you should also configure your Hot Rod client properties.
Procedure
Add Data Grid and the Spring integration module to your
pom.xml
.-
Remote caches:
infinispan-spring5-remote
Embedded caches:
infinispan-spring5-embedded
TipSpring Boot users can add the
infinispan-spring-boot-starter-embedded
instead of theinfinispan-spring5-embedded
artifact.
-
Remote caches:
Configure your Hot Rod client to connect to your Data Grid Server deployment in the
hotrod-client.properties
file.infinispan.client.hotrod.server_list = 127.0.0.1:11222 infinispan.client.hotrod.auth_username=admin infinispan.client.hotrod.auth_password=changeme
Spring Cache dependencies
Remote caches
<dependencies> <dependency> <groupId>org.infinispan</groupId> <artifactId>infinispan-spring5-remote</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${version.spring}</version> </dependency> </dependencies>
Embedded caches
<dependencies> <dependency> <groupId>org.infinispan</groupId> <artifactId>infinispan-spring5-embedded</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${version.spring}</version> </dependency> </dependencies>
Additional resources
1.2. Using Data Grid as a Spring Cache provider
Add the @EnableCaching
annotation to one of your configuration classes and then add the @Cacheable
and @CacheEvict
annotations to use remote or embedded caches.
Prerequisites
- Add the Data Grid dependencies to your application project.
- Create the required remote caches and configure Hot Rod client properties if you use a Data Grid Server deployment.
Procedure
Enable cache annotations in your application context in one of the following ways:
Declarative
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> <cache:annotation-driven /> </beans>
Programmatic
@EnableCaching @Configuration public class Config { }
Annotate methods with
@Cacheable
to cache return values.TipTo reference entries in the cache directly, you must include the
key
attribute.-
Annotate methods with
@CacheEvict
to remove old entries from the cache.
Additional resources
1.3. Spring Cache annotations
The @Cacheable
and @CacheEvict
annotations add cache capabilities to methods.
@Cacheable
- Stores return values in a cache.
@CacheEvict
- Controls cache size by removing old entries.
@Cacheable
Taking Book
objects as an example, if you want to cache each instance after loading it from a database with a method such as BookDao#findBook(Integer bookId)
, you could add the @Cacheable
annotation as follows:
@Transactional @Cacheable(value = "books", key = "#bookId") public Book findBook(Integer bookId) {...}
With the preceding example, when findBook(Integer bookId)
returns a Book
instance it gets stored in the cache named books
.
@CacheEvict
With the @CacheEvict
annotation, you can specify if you want to evict the entire books
cache or only the entries that match a specific #bookId.
Entire cache eviction
Annotate the deleteAllBookEntries()
method with @CacheEvict
and add the allEntries
parameter as follows:
@Transactional @CacheEvict (value="books", key = "#bookId", allEntries = true) public void deleteAllBookEntries() {...}
Entry based eviction
Annotate the deleteBook(Integer bookId)
method with @CacheEvict
and specify the key associated to the entry as follows:
@Transactional @CacheEvict (value="books", key = "#bookId") public void deleteBook(Integer bookId) {...}
1.4. Configuring timeouts for cache operations
The Data Grid Spring Cache provider defaults to blocking behaviour when performing read and write operations. Cache operations are synchronous and do not time out.
If necessary you can configure a maximum time to wait for operations to complete before they time out.
Procedure
Configure the following timeout properties in the context XML for your application on either
SpringEmbeddedCacheManagerFactoryBean
orSpringRemoteCacheManagerFactoryBean
.For remote caches, you can also add these properties to the
hotrod-client.properties
file.
Property | Description |
---|---|
|
Specifies the time, in milliseconds, to wait for read operations to complete. The default is |
|
Specifies the time, in milliseconds, to wait for write operations to complete. The default is |
The following example shows the timeout properties in the context XML for SpringRemoteCacheManagerFactoryBean
:
<bean id="springRemoteCacheManagerConfiguredUsingConfigurationProperties" class="org.infinispan.spring.remote.provider.SpringRemoteCacheManagerFactoryBean"> <property name="configurationProperties"> <props> <prop key="infinispan.spring.operation.read.timeout">500</prop> <prop key="infinispan.spring.operation.write.timeout">700</prop> </props> </property> </bean>