Spring Data JPA 提供了对缓存的支持,这可以帮助提高应用程序的性能,特别是在频繁访问相同数据的情况下。Spring Data JPA 默认使用 Hibernate 的二级缓存来实现缓存功能。
以下是 Spring Data JPA 中缓存的基本概念和使用方法:
要启用 Spring Data JPA 的缓存功能,你需要在配置文件中进行相应的设置。
# application.properties
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
spring.jpa.properties.hibernate.cache.use_query_cache=true
# application.yml
spring:
jpa:
properties:
hibernate:
cache:
use_second_level_cache: true
region:
factory_class: org.hibernate.cache.ehcache.EhCacheRegionFactory
use_query_cache: true
Spring Data JPA 支持多种缓存提供者,如 EhCache、Infinispan 等。上面的示例中使用了 EhCache。
如果你使用 EhCache,你需要添加 EhCache 的依赖,并创建一个 ehcache.xml
文件来配置缓存策略。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifact本>
<version>4.3.11.2</version>
</dependency>
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="10"
timeToLiveSeconds="10"
overflowToDisk="true"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
/>
<cache name="com.example.entity.User"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="10"
timeToLiveSeconds="10"
overflowToDisk="true"
diskPersistent="false"
diskExpreterThreadIntervalSeconds="120"
</cache>
</ehcache>
要在实体类上启用缓存,你需要使用 @Cacheable
注解。
import org.springframework.cache.annotation.Cacheable;
@Entity
@Cacheable
public class User {
// entity fields and methods
}
一旦启用了缓存并在实体类上添加了 @Cacheable
注解,Spring Data JPA 将自动缓存查询结果。
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User getUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
}
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
return userRepository.save(user);
}
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
}
领取专属 10元无门槛券
手把手带您无忧上云