当前位置:   article > 正文

基于MyBatis的多租户设计方案与实现(附代码)_mybatis 多租户方案

mybatis 多租户方案

  实习中一个项目需要从单租户模式改造成多租户,由于项目使用的是MyBatis,目前没有可以直接使用MyBatis来实现多租户的方式,因此决定搜集资料和方案,自己来实现一个DEMO。

我的多租户方案采用的是MyBatis+MyCat。DEMO是基于Spring MVC的web项目。在用户操作过程中获取用户的id信息,利用MyCat强大的注解功能,根据用户id将SQL语句路由到对应该用户的schema或者database去执行。对SQL加注解的实现则交由MyBatis的插件功能完成,通过自定义MyBatis的Interceptor类,拦截要执行的sql语句加上对应注解。这样就实现了数据库的多租户改造。下面分几个部分来说明。

  1. MyCat 与MySQL设置

        MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。MyCat相当于一个逻辑上的大数据库,又N多个物理数据库组成,可以通过各种分库分表规则(rule)将数据存到规则对应的数据库或schema或表中。

        MyCat对自身不支持的Sql语句提供了一种解决方案——在要执行的SQL语句前添加额外的一段由注解SQL组织的代码,这样Sql就能正确执行,这段代码称之为“注解”。注解的使用相当于对mycat不支持的sql语句做了一层透明代理转发,直接交给目标的数据节点进行sql语句执行,其中注解SQL用于确定最终执行SQL的数据节点。

    注解使用方式如下:

    

/*!mycat: schema=node1*/真正执行Sql

        这样写就可以将该Sql语句放到对应的node1的schema上执行,例如如果要在特定的节点上执行查询,则可以这样写

        

/*mycat: datanode=dn1*/select count(*) from item;
        

        由于这个项目是根据MyCat的SQL注解来选择在哪个schema或者database上执行的,所以不需要设置rule.xml。

        我的数据库设置如下:

        

  1. create database db02;
  2. CREATE TABLE item (
  3. id INT NOT NULL AUTO_INCREMENT,
  4. value INT NOT NULL default 0,
  5. indate DATETIME NOT NULL default '2000-01-01 00:00:00',
  6. PRIMARY KEY (id)
  7. )AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;
  8. create database db03;
  9. CREATE TABLE item (
  10. id INT NOT NULL AUTO_INCREMENT,
  11. value INT NOT NULL default 0,
  12. indate DATETIME NOT NULL default '2000-01-01 00:00:00',
  13. PRIMARY KEY (id)
  14. )AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;

设置两个数据库分表为db02,db03,两个库中都有item。

MyCat的配置如下:

server.xml

<?xml version="1.0" encoding="UTF-
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/407453
推荐阅读
相关标签
  

闽ICP备14008679号