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

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

时间:2023-06-04 23:12:24浏览次数:33  
标签:-- 数据源 class dataType 切换 tienchin public HttpSession

三、网页手动实现动态数据源切换

手动切换 数据源,采用HttpSession 保存数据源名称,在全局的切面定义service下所有方法,都会切换数据源。

1、定义一个html页面

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>切换数据源</title>
  <script src="jquery-3.6.0.js"></script>
</head>
<body>
<div>
  请选择数据源:
  <select name="" id="" onchange="dsChange(this.options[this.options.selectedIndex].value)">
    <option value="请选择">请选择</option>
    <option value="master">master</option>
    <option value="slave">slave</option>
  </select>
</div>
<div id="result"></div>
<button onclick="loadData()">加载数据</button>
<script>
  function dsChange(value) {
    $.post("/dataType",{dataType:value});
  }
  function loadData() {
    $.get("/users",function (data) {
      $("#result").html(JSON.stringify(data));
    })
  }
</script>
</body>
</html>

2、定义一个全局切换数据源切面

@Aspect
@Component
@Order(11)
public class GlobalDynamicDataSourceAspect {
    private static final Logger LOGGER = LoggerFactory.getLogger(GlobalDynamicDataSourceAspect.class);
    @Autowired
    private HttpSession httpSession;

    @Pointcut("execution(* com.example.datasource_tienchin.service.*.*(..))")
    public void pc(){}

    @Around("pc()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        // 设置数据源
        DynamicDataSourceContextHolder.setDatasourceType(
                ((String) httpSession.getAttribute(DataSourceType.SESSION_KEY_TYPE)));
        try {
            return pjp.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            throw throwable;
        }
    }

}

由于DynamicAspec 的@Order(10) ,所以它先执行,最后生效的是全局切面。

3、请求接口

@RestController
public class DynamicDataSourceController {
    private static final Logger LOGGER = LoggerFactory.getLogger(DynamicDataSourceController.class);
    @Autowired
    LoginUserService loginUserService;

    @PostMapping("/dataType")
    public void changeDataSource(String dataType, HttpSession session) {

        // session 中存储数据源名称
        session.setAttribute(DataSourceType.SESSION_KEY_TYPE, dataType);
        LOGGER.info("前端切换数据源 {} 了", dataType);
    }

    @GetMapping("/users")
    public List<LoginUser> queryUsers(){
        return loginUserService.getAllLoginUsers();
    }
}

当然,HttpSession可以存,其他方式也可以。

标签:--,数据源,class,dataType,切换,tienchin,public,HttpSession
From: https://www.cnblogs.com/Choleen/p/17456650.html

相关文章

  • 对于安卓发送 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个字符使用必要的空行可以增加代码的可读性运算......
  • zookeeper 入门讲解实例 转
    zookeeper使用和原理探究(一)zookeeper介绍zookeeper是一个为分布式应用提供一致性服务的软件,它是开源的Hadoop项目中的一个子项目,并且根据google发表的<TheChubbylockserviceforloosely-coupleddistributedsystems>论文来实现的,接下来我们首先来安装使用下这个软件,然后再......
  • 04.如何创建并运行java线程
    评:原文链接译者:章筱虎校对:方腾飞Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类。可以用如下方式用java中创建一个线程:查看源代码打印帮助1Treadthread=newThread();执行该线程可以调用该线程的start()方法:查看源代码打印帮助1thre......