【juc】ReentrantReadWriteLock之缓存(仅当学习)

目录

        • 一、说明
        • 二、代码示例
          • 2.1 pom依赖
          • 2.2 示例代码
          • 2.3 实体类
        • 三、示例截图

一、说明

  • 1.针对于读多写少的情况
  • 2.先查缓存,没有再去查库

二、代码示例

2.1 pom依赖


    4.0.0

    com.learning
    jdbc
    1.0-SNAPSHOT

    
        8
        8
    

    
        
            mysql
            mysql-connector-java
            8.0.21
        
        
            org.springframework
            spring-jdbc
            5.3.26
        
        
            org.mybatis
            mybatis
            3.5.6
        
        
            com.alibaba
            druid
            1.2.16
        
        
            org.projectlombok
            lombok
            1.18.26
        
    

2.2 示例代码
package com.learning;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.cache.CacheKey;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class DataCache {
    private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
    private Map map = new HashMap<>();

    private static DruidDataSource druidDataSource = new DruidDataSource();
    private static JdbcTemplate jdbcTemplate;
    static {
        druidDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("root");
        jdbcTemplate = new JdbcTemplate(druidDataSource);
    }

    public  T queryOne(Class beanClass, String sql, Object... args){
        // 从缓存中查找,找到则直接返回
        CacheKey key = new CacheKey(new Object[]{sql, args});
        reentrantReadWriteLock.readLock().lock();
        try{
            T value = (T)map.get(key);
            if(value != null){
                return value;
            }
        }finally{
            reentrantReadWriteLock.readLock().unlock();
        }
        reentrantReadWriteLock.writeLock().lock();
        try{
            // 多个线程,再获取一遍,检查一下,是否有线程写入成功了
            T value = (T) map.get(key);
            if(value == null){
                // 缓存中没有,查询数据库
                value = queryDatabase(beanClass, sql, args);
                map.put(key, value);
            }
            return value;
        }finally {
            reentrantReadWriteLock.writeLock().unlock();
        }
    }

    private  T queryDatabase(Class beanClass, String sql, Object[] args) {
        BeanPropertyRowMapper beanPropertyRowMapper = new BeanPropertyRowMapper();
        beanPropertyRowMapper.setMappedClass(beanClass);
        System.out.println("sql:"+sql);
        List list = jdbcTemplate.query(sql, args, beanPropertyRowMapper);
        return list.get(0);
    }

    public static void main(String[] args) {
        DataCache dataCache = new DataCache();
        String sql = "select * from student where id = ?";
        Object[] param = new Object[]{1};
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                Student student = dataCache.queryOne(Student.class, sql, param);
                System.out.println(student);;
            }).start();
        }
    }
}
2.3 实体类
package com.learning;

import lombok.Data;

@Data
public class Student {
    private String id;
    private String name;
    private int age;
}

三、示例截图

【juc】ReentrantReadWriteLock之缓存(仅当学习)_第1张图片

你可能感兴趣的:(juc,juc)