天天看点

MyBatis 使用 MyCat 实现多租户的一种简单思路

本文的多租户是基于多数据库进行实现的,数据是通过不同数据库进行隔离。

MyCat 基本配置

首先针对多租户配置了多个数据库,在 MyCat 的 schema.xml 中配置了多个 schema。

MyBatis 使用 MyCat 实现多租户的一种简单思路

在 server.xml 中配置了一个用户:

MyBatis 使用 MyCat 实现多租户的一种简单思路

后面会使用 MyCat 注解(就是注释)方式根据不同的标识,将操作指向不同的数据库。

过滤器识别请求匹配对应的数据库

标识有很多种方式可以加以区分,下面使用最简单的一种,通过不同的二级域名进行识别。二级域名和数据库对应的信息可以通过全局库或者公共库进行存储,还可以是简单的配置文件进行配置,不过下面代码只是为了演示,因此配置信息都是写死在代码中的。

假设存在以下二级域名,分别对应不同的数据库:

  1. ui1.mybatis.tk :UI1
  2. ui2.mybatis.tk :UI2
  3. ui3.mybatis.tk :UI3

通过过滤器,在用户请求时根据请求地址设置当前请求使用的数据库:

MyBatis 使用 MyCat 实现多租户的一种简单思路

这段代码只是很简单的判断,根据不同的字符串设置不同的数据库。使用了一个静态的本地线程变量来存储数据库信息。

重写 MyBatis 的 MappedStatement 简单实现 MyCat 注解

使用 MyBatis 和数据库进行操作时,所有执行的 sql 都是通过 MappedStatement 获取的,虽然通过拦截器方式也能给 sql 添加注解,但是实现起来有点复杂。通过重写 MappedStatement 会简单很多,但是你也需要保证重写的这个类能够替代默认的类。

重写很简单,只需要修改原有的 ​

​getBoundSql​

​ 方法:

MyBatis 使用 MyCat 实现多租户的一种简单思路