一、Spring Boot整合Ehcache
1、創建Maven項目。
參考https://mp.csdn.net/postedit/80731931
2、修改pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lxp</groupId>
<artifactId>01-springboot-springdatajpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
</parent>
<properties>
<java.version>1.7</java.version>
</properties>
<dependencies>
<!-- Web 啓動器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Junit測試 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- mysql數據庫驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- druid 數據連接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<!-- spring data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Spring Boot緩存支持啓動器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- Ehcache座標 -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
</dependencies>
</project>
3、創建Ehcache的配置文件。
文件名:ehcache.xml
位置:src/main/resources/ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="java.io.tmpdir"/>
<!--defaultCache:echcache的默認緩存策略 -->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</defaultCache>
<!-- 自定義緩存策略 -->
<cache name="users"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</cache>
</ehcache>
4、修改application.propreties文件
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/ssm
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.cache.ehcache.cofnig=ehcache.xml
5、修改啓動類
@SpringBootApplication
@EnableCaching // 添加@EnableCaching 註解
public class AppStart {
public static void main(String[] args) {
SpringApplication.run(AppStart.class, args);
}
}
6、創建業務層
@Service
public class SysUserServiceImpl implements SysUserService {
@Autowired
private SysUsersRepository sysUsersRepository;
@Override
public List<SysUsers> queryAllSysUsers() {
return sysUsersRepository.findAll();
}
@Override
@Cacheable(value = "users") // 對當前查詢的對象對緩存處理
public SysUsers querySysUsersById(Integer id) {
return sysUsersRepository.findOne(id);
}
@Override
public Page<SysUsers> queryPageSysUsers(Pageable pageable) {
return sysUsersRepository.findAll(pageable);
}
@Override
public void saveSysUsers(SysUsers sysUsers) {
this.sysUsersRepository.save(sysUsers);
}
}
7、修改實體類
@Entity
@Table(name = "sys_users")
public class SysUsers implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
@Column(name = "age")
private Integer age;
@Column(name = "addr")
private String addr;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "SysUsers [id=" + id + ", name=" + name + ", age=" + age + ", addr=" + addr + "]";
}
}
8、編寫測試類
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = AppStart.class)
public class RepositoryTest {
@Autowired
private SysUserService sysUserService;
@Test
public void TestSysUserService() {
// 第一次查詢
System.out.println(sysUserService.querySysUsersById(1));
// 第二次查詢
System.out.println(sysUserService.querySysUsersById(1));
}
}
注意點:1、在業務層的方法中你需要對那個方法開啓緩存就在那個方法上加上註解並指定緩存策略:@Cacheable(value = "users")。2、出現:java.io.NotSerializableException異常解決辦法:在你要調用的實體類裏面實現系列化接口
二、@Cacheable與@CacheEvict
1、 @Cacheable
@Cacheable作用:把方法的返回值添加到Ehcache中做緩存
value屬性:指定一個Ehcache配置文件中的緩存策略,如果麼有給定value,name則表示使用默認的緩存策略。
Key屬性:給存儲的值起個名稱。在查詢時如果有名稱相同的,那麼則知己從緩存中將數據返回
@Override
@Cacheable(value = "users", key = "#pageable.pageSize")
public Page<SysUsers> queryPageSysUsers(Pageable pageable) {
return sysUsersRepository.findAll(pageable);
}
@Test
public void TestSysUserService2() {
// 第一次查詢
Pageable pageable = new PageRequest(0, 2);
System.out.println(this.sysUserService.queryPageSysUsers(pageable).getTotalElements());
// 第二次查詢
System.out.println(this.sysUserService.queryPageSysUsers(pageable).getTotalElements());
// 第三次查詢
pageable = new PageRequest(1, 2);
System.out.println(this.sysUserService.queryPageSysUsers(pageable).getTotalElements());
}
2 、@CacheEvict
@CacheEvict作用:清除緩存@Override
// @CacheEvict(value="users",allEntries=true) 清除緩存中以users緩存策略緩存的對象
@CacheEvict(value = "users", allEntries = true)
public void saveSysUsers(SysUsers sysUsers) {
this.sysUsersRepository.save(sysUsers);
}
@Test
public void TestSysUserService2() {
// 第一次查詢
Pageable pageable = new PageRequest(0, 2);
System.out.println(this.sysUserService.queryPageSysUsers(pageable).getTotalElements());
SysUsers user = new SysUsers();
user.setAddr("CCC");
user.setAge(20);
user.setName("BCCB");
this.sysUserService.saveSysUsers(user);
// 第二次查詢
System.out.println(this.sysUserService.queryPageSysUsers(pageable).getTotalElements());
}