欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot如何引入緩存提高單次查詢(xún)數(shù)據(jù)效率

 更新時(shí)間:2024年01月27日 10:04:03   作者:張紫娃  
這篇文章主要介紹了SpringBoot如何引入緩存提高單次查詢(xún)數(shù)據(jù)效率問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

SpringBoot引入緩存提高單次查詢(xún)數(shù)據(jù)效率

第1步:引入緩存上下文

import com.zhangziwa.practisesvr.model.Student;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

import static org.apache.commons.lang3.ObjectUtils.anyNull;

public class StudentContextHolder {
    private static final ThreadLocal<Map<Integer, Student>> studentContextHolder = ThreadLocal.withInitial(HashMap::new);

    public static Student getStudent(Integer id) {
        if (Objects.isNull(id)) {
            return null;
        }
        return studentContextHolder.get().get(id);
    }

    public static void setStudent(Integer id, Student student) {
        if (anyNull(id, student)) {
            return;
        }
        if (getStudent(id) != null) {
            throw new UnsupportedOperationException("Student with id " + id + " already exists.");
        }
        studentContextHolder.get().put(id, student);
    }

    public static void clear() {
        studentContextHolder.remove();
    }
}

第2步:查詢(xún)先查緩存,查詢(xún)到值先存緩存

public Student queryById(Integer id) {
    if (Objects.isNull(id)) {
        return null;
    }
    
    // 線(xiàn)程緩存里去
    Student student = StudentContextHolder.getStudent(id);
    if (nonNull(student)) {
        return student;
    }
    
    student = studentsMapper.queryById(id);
    
    // 查詢(xún)數(shù)據(jù)庫(kù)值先存緩存
    StudentContextHolder.setStudent(id, student);
    
    return student;
}

第3步:清理緩存上下文

public class ResponsePostInterceptor implements HandlerInterceptor {

    //在Controller執(zhí)行之前調(diào)用,如果返回false,controller不執(zhí)行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.err.println("***ResponsePostInterceptor.preHandle***");
        return true;
    }

    //controller執(zhí)行之后,且頁(yè)面渲染之前調(diào)用
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.err.println("***ResponsePostInterceptor.postHandle***");
    }

    //頁(yè)面渲染之后調(diào)用,一般用于資源清理操作
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.err.println("***ResponsePostInterceptor.afterCompletion***");
        StudentContextHolder.clear(); //  清除student上下文
    }
}

第4步:驗(yàn)證使用

@GetMapping("{id}")
public ResponseEntity<Student> queryById(@PathVariable("id") Integer id) {
    System.out.println("***StudentController.queryById***");
    
    Student body = studentService.queryById(id);
    System.out.println(body);
    
    System.out.println(studentService.queryById(id));
    
    return ResponseEntity.ok(body);
}

執(zhí)行日志

[2024-01-26 01:16:16.068_068] [WARN ] [http-nio-8080-exec-2] [LogFilter.java:21] → [LogFilter.doFilter: Start processing request at 2024-01-25T17:16:16.068132700Z - /students/8]
***LogFilter.doFilter.start***
***RequestHeaderCheckFilter.doFilter.start***

***ResponsePostInterceptor.preHandle***
***LogInterceptor.preHandle***
[2024-01-26 01:16:16.094_094] [WARN ] [http-nio-8080-exec-2] [LogInterceptor.java:37] → [LogInterceptor.postHandle: Start processing request at 2024-01-25T17:16:16.094950300Z - /students/8]

***StudentController.queryById***
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3bfba234] was not registered for synchronization because synchronization is not active
[2024-01-26 01:16:16.128_128] [INFO ] [http-nio-8080-exec-2] [HikariDataSource.java:110] → [practisedb - Starting...]
[2024-01-26 01:16:16.248_248] [INFO ] [http-nio-8080-exec-2] [HikariPool.java:565] → [practisedb - Added connection com.mysql.cj.jdbc.ConnectionImpl@12e4ef1]
[2024-01-26 01:16:16.252_252] [INFO ] [http-nio-8080-exec-2] [HikariDataSource.java:123] → [practisedb - Start completed.]
JDBC Connection [HikariProxyConnection@688850212 wrapping com.mysql.cj.jdbc.ConnectionImpl@12e4ef1] will not be managed by Spring
==>  Preparing: select id, username, password, age, height, gender, class_id, is_delete from students where id = ?
***SqlExecuteInterceptor.intercept***
***SqlReadRowInterceptor.intercept***
==> Parameters: 8(Integer)
<==    Columns: id, username, password, age, height, gender, class_id, is_delete
<==        Row: 8, 汪子韜, lq2fks1eg5, 24, 161.84, 女, 5, 0
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3bfba234]
Student(id=8, username=汪子韜, password=lq2fks1eg5, age=24, height=161, gender=女, classId=5, isDelete=false)

Student(id=8, username=汪子韜, password=lq2fks1eg5, age=24, height=161, gender=女, classId=5, isDelete=false)

***ResponsePostAdvice.supports***
***ResponsePostAdvice.beforeBodyWrite***

***LogInterceptor.postHandle***
***ResponsePostInterceptor.postHandle***
***LogInterceptor.afterCompletion***
[2024-01-26 01:16:16.394_394] [WARN ] [http-nio-8080-exec-2] [LogInterceptor.java:57] → [LogInterceptor.postHandle: Finished processing request at 2024-01-25T17:16:16.393566400Z - /students/8 in 299 ms. Status code: 200]
[2024-01-26 01:16:16.413_413] [INFO ] [http-nio-8080-exec-2] [logUtils.java:70] → [{"traceId":"9287f21b215b49e19ed7fd94c9aed4e6","endDate":"2024-01-26T01:16:16.3972818+08:00[Asia/Shanghai]","cost":299,"remoteHost":"0:0:0:0:0:0:0:1","remoteAddr":"0:0:0:0:0:0:0:1","remotePort":12742,"method":"GET","requestURI":"/students/8","status":200,"requestContentLength":-1,"sqlCount":1,"sqlCost":31,"sqlSearchedRowCount":1,"currentThreadTime":109,"currentThreadUserTime":78,"currentThreadAllocatedBytes":20845224}]
[2024-01-26 01:16:16.419_419] [WARN ] [http-nio-8080-exec-2] [LogFilter.java:30] → [LogFilter.doFilter: Finished processing request at 2024-01-25T17:16:16.419516700Z - /students/8 in 351 ms. Status code: 200]
***ResponsePostInterceptor.afterCompletion***

***RequestHeaderCheckFilter.doFilter.end***
***LogFilter.doFilter.end***

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring帶bean和config如何通過(guò)main啟動(dòng)測(cè)試

    spring帶bean和config如何通過(guò)main啟動(dòng)測(cè)試

    這篇文章主要介紹了spring帶bean和config,通過(guò)main啟動(dòng)測(cè)試,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • spring boot整合CAS Client實(shí)現(xiàn)單點(diǎn)登陸驗(yàn)證的示例

    spring boot整合CAS Client實(shí)現(xiàn)單點(diǎn)登陸驗(yàn)證的示例

    本篇文章主要介紹了spring boot整合CAS Client實(shí)現(xiàn)單點(diǎn)登陸驗(yàn)證的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存

    SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存

    這篇文章主要介紹了SpringBoot + Mybatis-plus實(shí)戰(zhàn)之Mybatis-plus的一級(jí)緩存、二級(jí)緩存,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 使用Java Minio搭建自己的文件系統(tǒng)詳解

    使用Java Minio搭建自己的文件系統(tǒng)詳解

    這篇文章主要介紹了使用Java Minio搭建自己的文件系統(tǒng)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 詳解Java實(shí)現(xiàn)多種方式的http數(shù)據(jù)抓取

    詳解Java實(shí)現(xiàn)多種方式的http數(shù)據(jù)抓取

    本篇文章主要介紹了Java實(shí)現(xiàn)多種方式的http數(shù)據(jù)抓取,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。
    2016-12-12
  • Spring MVC 注解自動(dòng)掃描失效原因分析

    Spring MVC 注解自動(dòng)掃描失效原因分析

    這篇文章主要介紹了Spring MVC 注解自動(dòng)掃描失效原因分析,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • java隨機(jī)數(shù)生成具體實(shí)現(xiàn)代碼

    java隨機(jī)數(shù)生成具體實(shí)現(xiàn)代碼

    這篇文章主要為大家分享了java隨機(jī)數(shù)生成具體實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • Java中如何靈活獲取excel中的數(shù)據(jù)

    Java中如何靈活獲取excel中的數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于Java中如何靈活獲取excel中的數(shù)據(jù),在日常工作中我們常常會(huì)進(jìn)行文件讀寫(xiě)操作,除去我們最常用的純文本文件讀寫(xiě),更多時(shí)候我們需要對(duì)Excel中的數(shù)據(jù)進(jìn)行讀取操作,需要的朋友可以參考下
    2023-07-07
  • Java直接輸出對(duì)象變成@.....的問(wèn)題及解決

    Java直接輸出對(duì)象變成@.....的問(wèn)題及解決

    這篇文章主要介紹了Java直接輸出對(duì)象變成@.....的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • SpringBoot項(xiàng)目里集成Hibernate的示例

    SpringBoot項(xiàng)目里集成Hibernate的示例

    在Spring Boot項(xiàng)目中,集成Hibernate可以幫助我們更輕松地進(jìn)行數(shù)據(jù)庫(kù)操作,本文將介紹如何在Spring Boot項(xiàng)目中集成Hibernate,并提供相應(yīng)的示例,感興趣的朋友跟隨小編一起看看吧
    2023-04-04

最新評(píng)論