hibernate (3.6.x-Final) 2nd level cache using redis server. with jedis 2.4.1 or higher
reduce cache size by Fast-Serialization and snappy-java. thanks! try serialization benchmark.
Recommend use 3.6.10.Final
Hibernate 3.6.10.Final CacheKey eliminate entityOrRoleName property for reduce CacheKey size. if multiple entity cached in same region, can't figure out wanted entity.
add dependency
<dependency>
<groupId>com.github.stadia</groupId>
<artifactId>hibernate-redis</artifactId>
<version>1.5.9</version>
</dependency>
add repository
<repositories>
<repository>
<id>stadia-releases</id>
<url>https://github.com/stadia/stadia-maven-repo/raw/master/releases</url>
</repository>
<!-- for snapshot -->
<repository>
<id>stadia-snapshots</id>
<url>https://github.com/stadia/stadia-maven-repo/raw/master/snapshots</url>
</repository>
</repositories>
setup hibernate configuration.
// Secondary Cache
props.put(Environment.USE_SECOND_LEVEL_CACHE, true);
props.put(Environment.USE_QUERY_CACHE, true);
props.put(Environment.CACHE_REGION_FACTORY, SingletonRedisRegionFactory.class.getName());
props.put(Environment.CACHE_REGION_PREFIX, "hibernate");
// optional setting for second level cache statistics
props.setProperty(Environment.GENERATE_STATISTICS, "true");
props.setProperty(Environment.USE_STRUCTURED_CACHE, "true");
props.setProperty(Environment.TRANSACTION_STRATEGY, JdbcTransactionFactory.class.getName());
// configuration for Redis that used by hibernate
props.put(Environment.CACHE_PROVIDER_CONFIG, "hibernate-redis.properties");
also same configuration for using Spring Framework or Spring Data JPA
sample for hibernate-redis.properties
##########################################################
#
# properities for hibernate-redis
#
##########################################################
# Redis Server for hibernate 2nd cache
redis.host=localhost
redis.port=6379
# redis.timeout=2000
# redis.password=
# database for hibernate cache
# redis.database=0
redis.database=1
# hiberante 2nd cache default expiry (seconds)
redis.expiryInSeconds=120
# expiry of hibernate.common region (seconds) // hibernate is prefix, region name is common
redis.expiryInSeconds.hibernate.common=0
# expiry of hibernate.account region (seconds) // hibernate is prefix, region name is account
redis.expiryInSeconds.hibernate.account=1200
add @org.hibernate.annotations.Cache annotation to Entity class like this
@Entity
@Cache(region="common", usage = CacheConcurrencyStrategy.READ_WRITE) // or @Cacheable(true) for JPA
@Getter
@Setter
public class Item implements Serializable {
@Id
@GeneratedValue
private Long id;
private String name;
private String description;
private static final long serialVersionUID = -281066218676472922L;
}
run "redis-cli monitor" command in terminal. you can see putting cached items, retrieving cached items.
read HibernateCacheTest.java for more usage.