MyBatis利用MyCat实现多租户的简单思路分享
作者:isea533 时间:2022-08-16 18:58:33
前言
本文的多租户是基于多数据库进行实现的,数据是通过不同数据库进行隔离。下面话不多说,来看看详细的介绍:
MyCat 基本配置
首先针对多租户配置了多个数据库,在 MyCat 的 schema.xml 中配置了多个 schema。
在 server.xml 中配置了一个用户:
后面会使用 MyCat 注解(就是注释)方式根据不同的标识,将操作指向不同的数据库。
过滤器识别请求匹配对应的数据库
标识有很多种方式可以加以区分,下面使用最简单的一种,通过不同的二级域名进行识别。二级域名和数据库对应的信息可以通过全局库或者公共库进行存储,还可以是简单的配置文件进行配置,不过下面代码只是为了演示,因此配置信息都是写死在代码中的。
假设存在以下二级域名,分别对应不同的数据库:
ui1.mybatis.tk :UI1
ui2.mybatis.tk :UI2
ui3.mybatis.tk :UI3
通过过滤器,在用户请求时根据请求地址设置当前请求使用的数据库:
这段代码只是很简单的判断,根据不同的字符串设置不同的数据库。使用了一个静态的本地线程变量来存储数据库信息。
重写 MyBatis 的 MappedStatement 简单实现 MyCat 注解
使用 MyBatis 和数据库进行操作时,所有执行的 sql 都是通过 MappedStatement 获取的,虽然通过 * 方式也能给 sql 添加注解,但是实现起来有点复杂。通过重写 MappedStatement 会简单很多,但是你也需要保证重写的这个类能够替代默认的类。
重写很简单,只需要修改原有的 getBoundSql 方法:
这段代码就是在返回 BoundSql 前,修改 sql,添加 /*!mycat:schema=数据库*/
,具体的数据库从过滤器的静态方法获取,由于每一个请求都会经过过滤器(特别注意,如果是任务一类的调用,不需要经过过滤器,这种情况需要处理任务执行时数据库的绑定,这需要根据具体业务实现),因此这里的操作一定能获取到具体的数据库。增加这个注解后,MyCat 执行时就会自动将数据库的操作发送到指定的数据库上执行,通过这种方式就实现了一种简单的多租户方式。
来源:http://blog.csdn.net/isea533/article/details/56282316
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java中线程的等待与唤醒_动力节点Java学院整理
![](https://img.aspxhome.com/file/2023/4/57694_0s.png)
SpringCloud Gateway使用详解
jQuery 动画效果代码分享
springboot实现在工具类(util)中调用注入service层方法
![](https://img.aspxhome.com/file/2023/6/60616_0s.png)
Java读取json数据并存入数据库的操作代码
基于JAVA文件中获取路径及WEB应用程序获取路径的方法
Java emoji持久化mysql过程详解
十分钟理解Java中的动态代理
![](https://img.aspxhome.com/file/2023/5/60265_0s.jpg)
java 根据经纬度获取地址实现代码
java语言实现猜数字游戏
![](https://img.aspxhome.com/file/2023/6/59206_0s.jpg)
java 输入一个数字组成的数组(输出该数组的最大值和最小值)
JAVA实现长连接(含心跳检测Demo)
java中初始化MediaRecorder的实现方法
spring springMVC中常用注解解析
java基于包结构的请求路由实现实例分享
Spring Native打包本地镜像的操作方法(无需通过Graal的maven插件buildtools)
![](https://img.aspxhome.com/file/2023/9/59319_0s.jpg)