SaaS是Software-as-a-Service(软件即服务)的简称,这边具体的解释不介绍。多租户的系统可以应用这种模式的思想,将思想融入到系统的设计之中。

现在SaaS Multi-Tenant在数据存储上存在两大类共三种主要的方案,分别是:独立数据库和共享数据库,其中共享数据库又可分为共享数据库,隔离数据架构和共享数据库,共享数据架构。 具体如下:

独立数据库,即一个Tenant一个Database,这种方案的用户数据隔离级别最高,安全性最好,但成本也高。

共享数据库,隔离数据架构, 即多个或所有租户共享Database,但一个Tenant一个Schema。

共享数据库,共享数据架构, 即租户共享同一个Database、同一个Schema,但在表中通过TenantID区分租户的数据。这是共享程度最高、隔离级别最低的模式。

1.下面简单谈谈基于JPA实现上述的第二种方案:创建数据库demo,表名tb_user,tb_user_1,tb_user_2,tb_user_3。表结构如下图所示:

图1-1 表结构

2.使用经典的三层架构(3-tier application)开发web应用,此时完成了最最最普通的查询与保存功能。如下图所示:

图2-1 application.properties

图2-2 controller

图2-3 service

图2-4 dao

图2-5 model

图2-6 状态枚举

3.通过1和2两个步骤我们已经可以正常的查询和保存数据了,但是全都保存在了tb_user表中,实际上我们多租户系统是需要根据tenantId来将数据保存到不同的表中的。接下来就是重点。创建共享常量类用来保存需要分表的表名集合或数组。我们将表名写到配置文件中split.table.list,方便修改。

图3-1 共享常量

4.创建本地线程共享变量用来存放租户ID,接口请求时就是根据前端传的租户Id来区分是哪一个租户。这里还可以扩展一下,比如接口请求实际上花费了多少时间等等,将有用的字段定义一下。

图4-1 本地线程共享变量

5.实现WebMvcConfigurer接口里的addInterceptors方法添加全局拦截器,在全局拦截器里我们拦截每一个请求,将租户ID存到我们的本地线程共享变量中。

图5-1 WebMvcConfigurer

图5-2 interceptor

6.这一步才是重中之重,划重点。继承EmptyInterceptor类重写onPrepareStatement方法,onPrepareStatement方法是在准备sql字符串时调用的,所以这里我们可以将其稍微改造一下。根据本地线程共享变量中的租户ID和需要分表的表名来修改对应sql语句,最后返回原始或修改过的sql。这样就以为大功告成了吗,错了,还需要再配置一下hibernate拦截器实现的包名路径:spring.jpa.properties.hibernate.ejb.interceptor=com.saas.demo.config.JpaInterceptor

图6-1 hibernate拦截器

经过上面6个步骤,我们已经实现了JPA分表的功能,调用一下接口http://127.0.0.1:10002/user/users查看数据,Http消息头(Http Headers)里添加tenantId值作为租户的区分。看看结果:

租户1结果

租户2结果

租户1(tb_user_1)事先插入了一条数据,租户2(tb_user_2)没有数据。ok,大功告成,收工。

租户隔离怎么做MYSQL_基于JPA实现SaaS多租户模式的数据存储——共享数据库,隔离数据架构...相关推荐

  1. 租户隔离怎么做MYSQL_一种SaaS软件租户数据隔离的方法与流程

    本发明涉及计算机技术领域,尤其涉及一种SaaS软件租户数据隔离的方法. 背景技术: SaaS是Software-as-a-Service的简称,随着互联网技术的发展和应用软件的成熟, 在21世纪开始兴 ...

  2. 多租户数据库设计方法:共享数据库表

    共享数据库.独立 Schema (1) 什么是Schema oracle数据库:在oracle中一个数据库可以具有多个用户,那么一个用户一般对应一个Schema,表都是建立在Schema中的,(可以简 ...

  3. 读 TiDB 论文有感 | 数据强一致性且资源隔离的 HTAP 数据库

    作者介绍: 陈现麟,伴鱼技术中台负责人,从 0 到 1 搭建伴鱼技术中台,对分布式架构.服务治理.稳定性建设.高并发高 QPS 系统和中台化的组织架构搭建有一定的经验,崇尚简单优雅的设计,关注云原生和 ...

  4. 爬虫mysql数据清洗_爬虫分析之数据存储——基于MySQL,Scrapy

    配置MySql 关于MySQL在Ubuntu的Pycharm上的配置,可以参考这篇文章中的第三部分 如果上面的步骤处理完毕后找不到你新建的数据库, 可以参照下图配置 勾选要显示的Schemas(数据库 ...

  5. 基于物联网的数据接入与数据存储的一些思考

    基于物联网的数据接入和数据存储 一.边缘计算 边缘计算是指靠近物或数据源头的一侧,采用网络.计算.存储.应用核心能力为一体的开放平台.网络边缘侧可以是从数据源到云计算中心之间的任意功能实体,这些实体搭 ...

  6. 基于大数据的情报分析与服务系统架构设计

    一.大数据在军事领域中的应用  技术作为一项从大量数据中获取有用知识的实用技术,已被广泛应用于各行各业并取得了较大的经济和社会效益,而其在军事领域的应用也具有很大的潜力. 1 提升情报获取能力 现代战 ...

  7. 为什么要做数据治理以及如何进行数据治理?

    大家好,我是王老狮,今年工信部进行数据安全管理认证,公司很"幸运"的倍挑中进行试点执行,那么为了保证数据安全合规且满足数据管理等级的认证,今年做了很多的动作.那么就根据数据治理的一 ...

  8. java计算机毕业设计基于安卓Android的金融保险app(源码+系统+mysql数据库+Lw文档)

    项目介绍 计算机信息技术的发展,推动了金融保险信息化管理的进程,并随着互联网+概念的提出,各种互联网+软件也应运而生.在传统的管理中,各种信息管理难,传播速度慢,需要耗费很长时间统计核查,不能满足现代 ...

  9. 基于Python操作将数据存储到本地文件

    点击蓝字 关注我们 前面说过Python爬取的数据可以存储到文件.关系型数据库.非关系型数据库.前面两篇文章没看的,可快速戳这里查看!<使用Python将数据存入SQLite3数据库> & ...

最新文章

  1. linux c++ 目录操作,C++文件及文件夹操作整理(代码示例)
  2. Ceilometer Polling Performance Improvement
  3. mysql 主从 问题_Mysql主从复制的问题与解决
  4. Go并发编程中的那些事[译]
  5. 被AI人机疯狂单杀?王者荣耀AI“绝悟”亲测体验
  6. [Oracle] Data Pump 详细使用教程(5)- 命令交互模式
  7. hibernateTemplate.find或hibernateTemplate.save()执行操作没有反应,但是有sql语句
  8. python+selenium 实现完全控制浏览器
  9. ZZULIOJ-1047,对数表(Python)
  10. 二进制乘除法运算原理
  11. Android 如何判断萤石云视频是否可以播放
  12. laravel从入门到精通之 时区设置
  13. 灵活用工系统开发|劳务派遣有风险吗?
  14. 你的数字生活:如何转变为一个个0和1?
  15. phpmyadmin 修改记录(不断更新)
  16. python PIL图片拼接
  17. Python文件读取
  18. CAS和自旋到底是一个概念吗?
  19. IEEE754标准转换
  20. 记微信开发者工具登录网络连接失败

热门文章

  1. 帕斯卡命名法、驼峰命名法、下划线命名法
  2. 在手机上安装Ubuntu(Termux)
  3. 苹果小程序闪退 camera组件
  4. 华为服务器 远程虚拟控制 如何连接
  5. 计算机为用户设置上网时间,电脑怎么设置上网时间限制
  6. 网络空间安全导论实践报告
  7. 【LeetCode】面试题 10.11. 峰与谷
  8. 8.1 标量、向量、矩阵和张量
  9. 不写情书,程序员还要学写作吗?
  10. 薅羊毛 | Python 自动化带你轻松赚钱(完结版)