zoukankan      html  css  js  c++  java
  • springboot整合Ehcache

    首先引入maven包:

    <dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-cache</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>net.sf.ehcache</groupId>
    			<artifactId>ehcache</artifactId>
    		</dependency>
    

      然后在启动类上添加注解:@EnableCaching//开启缓存

    配置application.properties

    #server
    server.servlet.context-path=/demo
    server.port=8080
    server.tomcat.uri-encoding=utf-8
    
    #设置freemarker模板后缀
    spring.freemarker.suffix=.html
    #修改模板默认文件夹
    spring.freemarker.template-loader-path=classpath:/web
    
    #datasource  tomcat-jdbc
    spring.datasource.url=jdbc:mysql://localhost:3306/boot?characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    
    #jpa
    spring.jpa.database=mysql
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.show-sql=true
    
    #ehcache
    spring.cache.type=ehcache
    spring.cache.ehcache.config=classpath:/config/ehcache.xml
    

      配置ehcache.xml:

           <!--  
               设定具体的命名缓存的数据过期策略。每个命名缓存代表一个缓存区域
               缓存区域(region):一个具有名称的缓存块,可以给每一个缓存块设置不同的缓存策略。
               如果没有设置任何的缓存区域,则所有被缓存的对象,都将使用默认的缓存策略。即:<defaultCache.../>
               Hibernate 在不同的缓存区域保存不同的类/集合。
                对于类而言,区域的名称是类名。如:com.atguigu.domain.Customer
                对于集合而言,区域的名称是类名加属性名。如com.atguigu.domain.Customer.orders
           -->
           <!--  
               name: 设置缓存的名字,它的取值为类的全限定名或类的集合的名字 
               maxElementsInMemory: 设置基于内存的缓存中可存放的对象最大数目 
               eternal: 设置对象是否为永久的, true表示永不过期, 此时将忽略timeToIdleSeconds 和 timeToLiveSeconds属性; 默认值是false 
                                    timeToIdleSeconds:设置对象空闲最长时间,以秒为单位, 超过这个时间,对象过期。当对象过期时,EHCache会把它从缓存中清除。如果此值为0,表示对象可以无限期地处于空闲状态。 
               timeToLiveSeconds:设置对象生存最长时间,超过这个时间,对象过期。如果此值为0,表示对象可以无限期地存在于缓存中. 该属性值必须大于或等于 timeToIdleSeconds 属性值 
               overflowToDisk:设置基于内存的缓存中的对象数目达到上限后,是否把溢出的对象写到基于硬盘的缓存中 
           -->
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
        <!--  
            指定一个目录:当 EHCache 把数据写到硬盘上时, 将把数据写到这个目录下.
        -->     
        <diskStore path="d:\cache"/>
    
        <!--设置缓存的默认数据过期策略 -->
        <!-- <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" /> -->
        
        <cache name="Student" eternal="false" maxElementsInMemory="10000" timeToIdleSeconds="200" overflowToDisk="true" timeToLiveSeconds="200"/>
    
    </ehcache>
    

      这样,Ehcache已经整合到springboot中了。

    简单测试缓存:

    package com.example.demo.dao;
    
    
    import org.springframework.data.jpa.repository.JpaRepository;
    
    import com.example.demo.entity.Student;
    
    public interface StudentDao extends JpaRepository<Student, Integer> {
    	Student findStudentById(Integer id);
    }
    

      

    package com.example.demo.service;
    
    import com.example.demo.entity.Student;
    
    public interface StudentService {
    	public Student getStudentById(Integer id) ;
    }
    

      

    package com.example.demo.service.impl;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.stereotype.Service;
    
    import com.example.demo.dao.StudentDao;
    import com.example.demo.entity.Student;
    import com.example.demo.service.StudentService;
    
    @Service
    public class StudentServiceImpl implements StudentService {
    
    	@Autowired
    	private StudentDao studentDao;
    	
    	@Cacheable(cacheNames= {"Student"})
    	public Student getStudentById(Integer id) {
    		return studentDao.findStudentById(id);
    	}
    }
    

      

    package com.example.demo.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import com.example.demo.entity.Student;
    import com.example.demo.service.StudentService;
    
    @Controller
    @RequestMapping("/student/")
    public class StudentController {
    	@Autowired
    	private StudentService studentService;
    	
    	@RequestMapping("index")
    	public String index() {
    		
    		return "index";
    	}
    	
    	@RequestMapping("show")
    	public String getStudengById(Student student,Model model) {
    		student = studentService.getStudentById(student.getId());
    		model.addAttribute("student", student);
    		return "index";
    	}
    
    }
    

      

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <h1>index</h1>
    <a href="/demo/student/show?id=1">查询学生</a>
    <#if student??>
        用户名:${student.name}
    </#if>
    </body>
    </html>
    

      第一次查询会产生SQL,第二次查询没有产生SQL,说明缓存已经失效,或者第一次查询完毕后,修改数据库数据,再次查询,数据未改变,说明是从缓存获取的数据。

  • 相关阅读:
    ArrayList removeRange方法分析
    LinkedHashMap源码分析(基于JDK1.6)
    LinkedList原码分析(基于JDK1.6)
    TreeMap源码分析——深入分析(基于JDK1.6)
    51NOD 2072 装箱问题 背包问题 01 背包 DP 动态规划
    51 NOD 1049 最大子段和 动态规划 模板 板子 DP
    51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
    8月20日 训练日记
    CodeForces
    CodeForces
  • 原文地址:https://www.cnblogs.com/blog411032/p/10371144.html
Copyright © 2011-2022 走看看