• 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,说明缓存已经失效,或者第一次查询完毕后,修改数据库数据,再次查询,数据未改变,说明是从缓存获取的数据。

  • 相关阅读:
    通过Ambari2.2.2部署HDP大数据服务
    Ganglia监控安装配置
    Kafka安装配置
    Graylog2日志服务安装配置
    Dnsmasq域名解析系统安装配置
    在haoodp-2.7.3 HA的基础上安装Hbase HA
    MySQL5.6基于mysql-proxy实现读写分离
    MySQL5.6基于MHA方式高可用搭建
    CentOS使用yum安装drbd
    MySQL5.6基于GTID的主从复制配置
  • 原文地址:https://www.cnblogs.com/blog411032/p/10371144.html
Copyright © 2020-2023  润新知