首页 > 其他分享 >二、tienchin健身系统下的技术点复现--动态数据源

二、tienchin健身系统下的技术点复现--动态数据源

时间:2023-06-04 23:13:23浏览次数:32  
标签:return name -- 数据源 id tienchin public String

二、配置动态数据源

前面我们已经准备了基础的类,@DynamicDatasource、DruidProperties、DynamicAspect

现在我们开始对 AbstractRoutingDatasource 所需要的数据源,放到对应的map结构中。

1、加载数据源

/**
 * 功能描述 加载自定义的数据源,存入到 Map<String,Datasource> 结构中
 *
 * @author [山沉]
 * @个人博客 [https://choleen95.github.io/]
 * @博客 [https://www.cnblogs.com/Choleen/]
 * @since [2023/6/4 10:00]
 */
@Component
@EnableConfigurationProperties(DruidProperties.class)
public class LoadDataSource {

    @Autowired
    DruidProperties druidProperties;

    public Map<String, DataSource> loadDatasource() {
        Map<String, DataSource> map = new HashMap<>();
        // 获取自定义数据源的属性
        Map<String, Map<String, String>> druidMap = druidProperties.getDruid();
        try {
            // 数据源名称 master、slave
            Set<String> keySet = druidMap.keySet();
            for (String name : keySet) {
                map.put(name, druidProperties.dataSource(
                        ((DruidDataSource) DruidDataSourceFactory.createDataSource(druidMap.get(name)))));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }

}

2、设置默认、目标数据源

/**
 * 功能描述 重写AbstractRoutingDataSource 的一个方法
 *
 * @author [山沉]
 * @个人博客 [https://choleen95.github.io/]
 * @博客 [https://www.cnblogs.com/Choleen/]
 * @since [2023/6/3 22:49]
 */
@Component
public class DynamicRoutingDataSource extends AbstractRoutingDataSource {

    public DynamicRoutingDataSource(LoadDataSource loadDatasource) {
        Map<String, DataSource> allDataSource = loadDatasource.loadDatasource();
        // 1.设置所有数据源
        super.setTargetDataSources(new HashMap<>(allDataSource));
        // 2.设置默认的数据源
        super.setDefaultTargetDataSource(allDataSource.get(DataSourceType.DEFAULT_DS_TYPE));
        // 3.设置配置
        super.afterPropertiesSet();
    }

    /**
     * 该方法是用来返回数据源的名称,当系统需要获取数据源的时候,会自动调用该方法获取数据源的名称
     *
     * @author 山沉
     * @date 2023/6/4 10:12
     * @return {@link Object}
     */
    @Override
    protected Object determineCurrentLookupKey() {
        return DynamicDataSourceContextHolder.getDatasourceType();
    }
}

到了这一步基本就设置完成,总的来说就是依据 AbstracRoutingDataSource 来存储 target 和 default 的数据源,重写 determineCurrentLookupKey 方法。

/**
 * 功能描述 常用配置变量
 *
 * @author [山沉]
 * @个人博客 [https://choleen95.github.io/]
 * @博客 [https://www.cnblogs.com/Choleen/]
 * @since [2023/6/4 10:22]
 */
public interface DataSourceType {
    String DEFAULT_DS_TYPE = "master";
}

3、单元测试

3.0 创建service、mapper、domian

@Service
public class LoginUserService {

    @Autowired
    private LoginUserMapper loginUserMapper;

    public List<LoginUser> getAllLoginUsers() {
        return loginUserMapper.getAllLoginUsers();
    }
}

public class LoginUser {

    private Long id;
    private String name;

    @Override
    public String toString() {
        return "LoginUser{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

@Mapper
public interface LoginUserMapper {
    /**
     * 查找所有的登录用户
     *
     * @author 山沉
     * @date 2023/6/4 10:41
     * @return {@link List< LoginUser>}
     */
    @Select("select * from t_login_user")
    List<LoginUser> getAllLoginUsers();
}

然后看下数据库

tesdb2、testdb 两个库中有相同的t_login_user表

slave对应如下

master对应如下

3.1 直接访问

直接访问,不添加注解,是默认数据源

3.2 加注解访问

标签:return,name,--,数据源,id,tienchin,public,String
From: https://www.cnblogs.com/Choleen/p/17456642.html

相关文章

  • day08-SpringCloud Gateway-服务网关
    SpringCloudGateway-服务网关1.Gateway介绍1.1引出问题没有使用网关服务时:使用网关服务后:1.2Gateway网络拓扑图1.3Gateway是什么官网:SpringCloudGatewayGateway是Spring生态系统之上构建的API网关服务,基于Spring、SpringBoot和ProjectReactor等技术Gateway旨在......
  • 三、tienchin健身系统下的技术点复现--动态数据源
    三、网页手动实现动态数据源切换手动切换数据源,采用HttpSession保存数据源名称,在全局的切面定义service下所有方法,都会切换数据源。1、定义一个html页面<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>切换数据源</title><scriptsrc=&quo......
  • 对于安卓发送 http 请求的实践
    配置权限配置要注意配置的位置1添加网络权限<manifest><application>.......</application><uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permissionandroid:name="android.permission......
  • JS中创建对象的几种常见的方式
    创建对象方式//方式1varobj1={"name":"方式1"}//方式2varobj2={name:"方式2"}//方式3varobj3=newObject({"name":"方式3"});//方式4varobj4=newObject();obj4.name="方式4"//方式5:通过对象构造器创建对象fu......
  • 枪决通知短信:网络欺诈的新变种与社会责任
    一、引言在当今数字化世界,信息传播的速度和范围已经达到了前所未有的高度,然而,这种便捷的通讯方式也为不法分子提供了便利。近期,有很多人收到了所谓的“枪决通知短信”,引起了社会的广泛关注。本文将对这一现象进行剖析,并讨论如何防范和应对这种网络欺诈行为,以及社会各界在其中应承......
  • 查找目录下的所有文件中是否含有某个字符串 linux
    评:查找目录下的所有文件中是否含有某个字符串find.|xargsgrep-ri"IBM"查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名find.|xargsgrep-ri"IBM"-l1.正则表达式(1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称......
  • 在HBase中应用MemStore-Local Allocation Buffers解决Full GC问题
      译者注:上个月写了一遍博文,介绍一种高效的Java缓存实现http://maoyidao.iteye.com/blog/1559420。其本质是模仿Memcached的Slab,通过分配连续定长的byte[]减少大规模使用JavaHeap作为缓存时不可避免的GC问题。虽然当时构思和实现这一思路时并没有参照其他开源产品,但这一思路在很......
  • hbase gc MemStore-Local Allocation Buffer
     ArenaAllocation,是一种GC优化技术,它可以有效地减少因内存碎片导致的FullGC,从而提高系统的整体性能。本文介绍ArenaAllocation的原理及其在Hbase中的应用-MSLAB。背景假设有1G内存,我顺序创建了1百万个对象,每个对象大小1K,Heap会被渐渐充满且每个对象以创建顺序相邻。此时,如果我......
  • Java Map 集合类简介
    源:http://www.oracle.com/technetwork/cn/articles/maps1-100947-zhs.html#T1评:了解最常用的集合类型之一Map的基础知识以及如何针对您应用程序特有的数据优化Map。java.util中的集合类包含Java中某些最常用的类。最常用的集合类是List和Map。......
  • Python程序与设计
    2-27在命令行窗口中启动的Python解释器中实现在Python自带的IDLE中实现print("Helloworld")编码规范每个import语句只导入一个模块,尽量避免一次导入多个模块不要在行尾添加分号“:”,也不要用分号将两条命令放在同一行建议每行不超过80个字符使用必要的空行可以增加代码的可读性运算......