美文网首页
使用锁的缓存的一个实际应用。这儿用到了dlc锁。

使用锁的缓存的一个实际应用。这儿用到了dlc锁。

作者: zxbyh | 来源:发表于2023-04-07 15:50 被阅读0次

使用锁的缓存的一个实际应用。这儿用到了dlc锁。

public abstract class MyDao {
    private volatile String dbTypeStr = ""; //volatile 保证有序性,防止指令重排

    protected abstract  JdbcTemplate  getJdbcTemplate();

//DCL 锁,性能好
    public DbEnum getDbType(){
        if(StringUtils.isBlank(this.dbTypeStr)){ //double check lock
            synchronized (this) {
                if (StringUtils.isBlank(this.dbTypeStr)) {
                    this.dbTypeStr = DbEnum.toStr(EasyDao.dbType(this.getJdbcTemplate()));
                }
            }
        }

        return DbEnum.toEnum(this.dbTypeStr);

    }

    //普通锁 ,性能不好
    public synchronized DbEnum getDbTypeSync(){
        if(StringUtils.isNotBlank(this.dbTypeStr)){
            return DbEnum.toEnum(this.dbTypeStr);
        }
        DbEnum dbEnum = dbType(this.getJdbcTemplate());
        this.dbTypeStr = DbEnum.toStr(dbEnum);
        return dbEnum;
    }


    //注意:这个要消耗性能的,请用一次就缓存下来.
    public static DbEnum dbType(JdbcTemplate jdbcTemplate){
        try {
            String driverName = jdbcTemplate.getDataSource().getConnection().getMetaData().getDriverName();

            if(driverName.startsWith("MySQL")){
                return DbEnum.MySql;
            }
            else if(driverName.startsWith("PostgreSQL")){
                return DbEnum.PgSql;
            }
            else {
                Asserts.fail(-1001,"不支持的数据库:"+driverName);
                return null;
            }
        }
        catch (SQLException sqlException){
            Asserts.fail(-1001,sqlException.getMessage());
            return null;
        }
    }
}

相关文章

  • 4:Redis 分布式锁 (文末有项目连接)

    1:什么是缓存分布式锁 2:分布式锁的关键代码 3:业务代码使用分布式缓存锁 4:业务代码使用分布式缓存锁 5:测...

  • 线程安全的单例模式

    DLC(双重检查锁)+volatile关键字实现: 使用静态Holder类

  • 腾讯预面试

    锁表 只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁! 在实际应用中,要特别注意...

  • 缓存使用、锁以及分布式锁Redisson

    缓存使用、锁以及分布式锁Redisson 为什么使用缓存 在高并发请求时,我们会频繁提到使用缓存技术,最直接的原因...

  • 学习 SDWebImage

    大量使用 对象锁 SDImageCache 1. 内容缓存 memCache 用 NSCache 实现 2. ...

  • iOS-几种锁的应用

    前言 这篇文章,记录几种锁的简单应用。 @synchronized 使用起来最简单的一个锁,直接将要锁定的代码用@...

  • 关于缓存的一些总结(4)

    使用锁来解决缓存击穿问题一提起锁大家可能都想到使用synchronized或者Lock这样的锁。在合理利用到syn...

  • 基于缓存或zookeeper的分布式锁实现

    阅读目录 缓存锁 zookeeper 锁 比较 回到顶部 缓存锁 我们常常将缓存作为分布式锁的解决方案,但是却不能...

  • 原子操作的实现原理

    1. 处理器如何实现原子操作 1.1 使用总线锁 1.2 使用缓存锁 2. Java如何实现原子操作 2.1 偏向...

  • 【The Java™ Tutorials】【Concurrenc

    Lock Objects 前面我们都是用一个对象的固有锁来实现同步的,对象的固有锁是重入锁。对象的固有锁很方便使用...

网友评论

      本文标题:使用锁的缓存的一个实际应用。这儿用到了dlc锁。

      本文链接:https://www.haomeiwen.com/subject/wygpddtx.html