租户隔离怎么做MYSQL_基于JPA实现SaaS多租户模式的数据存储——共享数据库,隔离数据架构...
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多租户模式的数据存储——共享数据库,隔离数据架构...相关推荐
- 租户隔离怎么做MYSQL_一种SaaS软件租户数据隔离的方法与流程
本发明涉及计算机技术领域,尤其涉及一种SaaS软件租户数据隔离的方法. 背景技术: SaaS是Software-as-a-Service的简称,随着互联网技术的发展和应用软件的成熟, 在21世纪开始兴 ...
- 多租户数据库设计方法:共享数据库表
共享数据库.独立 Schema (1) 什么是Schema oracle数据库:在oracle中一个数据库可以具有多个用户,那么一个用户一般对应一个Schema,表都是建立在Schema中的,(可以简 ...
- 读 TiDB 论文有感 | 数据强一致性且资源隔离的 HTAP 数据库
作者介绍: 陈现麟,伴鱼技术中台负责人,从 0 到 1 搭建伴鱼技术中台,对分布式架构.服务治理.稳定性建设.高并发高 QPS 系统和中台化的组织架构搭建有一定的经验,崇尚简单优雅的设计,关注云原生和 ...
- 爬虫mysql数据清洗_爬虫分析之数据存储——基于MySQL,Scrapy
配置MySql 关于MySQL在Ubuntu的Pycharm上的配置,可以参考这篇文章中的第三部分 如果上面的步骤处理完毕后找不到你新建的数据库, 可以参照下图配置 勾选要显示的Schemas(数据库 ...
- 基于物联网的数据接入与数据存储的一些思考
基于物联网的数据接入和数据存储 一.边缘计算 边缘计算是指靠近物或数据源头的一侧,采用网络.计算.存储.应用核心能力为一体的开放平台.网络边缘侧可以是从数据源到云计算中心之间的任意功能实体,这些实体搭 ...
- 基于大数据的情报分析与服务系统架构设计
一.大数据在军事领域中的应用 技术作为一项从大量数据中获取有用知识的实用技术,已被广泛应用于各行各业并取得了较大的经济和社会效益,而其在军事领域的应用也具有很大的潜力. 1 提升情报获取能力 现代战 ...
- 为什么要做数据治理以及如何进行数据治理?
大家好,我是王老狮,今年工信部进行数据安全管理认证,公司很"幸运"的倍挑中进行试点执行,那么为了保证数据安全合规且满足数据管理等级的认证,今年做了很多的动作.那么就根据数据治理的一 ...
- java计算机毕业设计基于安卓Android的金融保险app(源码+系统+mysql数据库+Lw文档)
项目介绍 计算机信息技术的发展,推动了金融保险信息化管理的进程,并随着互联网+概念的提出,各种互联网+软件也应运而生.在传统的管理中,各种信息管理难,传播速度慢,需要耗费很长时间统计核查,不能满足现代 ...
- 基于Python操作将数据存储到本地文件
点击蓝字 关注我们 前面说过Python爬取的数据可以存储到文件.关系型数据库.非关系型数据库.前面两篇文章没看的,可快速戳这里查看!<使用Python将数据存入SQLite3数据库> & ...
最新文章
- linux c++ 目录操作,C++文件及文件夹操作整理(代码示例)
- Ceilometer Polling Performance Improvement
- mysql 主从 问题_Mysql主从复制的问题与解决
- Go并发编程中的那些事[译]
- 被AI人机疯狂单杀?王者荣耀AI“绝悟”亲测体验
- [Oracle] Data Pump 详细使用教程(5)- 命令交互模式
- hibernateTemplate.find或hibernateTemplate.save()执行操作没有反应,但是有sql语句
- python+selenium 实现完全控制浏览器
- ZZULIOJ-1047,对数表(Python)
- 二进制乘除法运算原理
- Android 如何判断萤石云视频是否可以播放
- laravel从入门到精通之 时区设置
- 灵活用工系统开发|劳务派遣有风险吗?
- 你的数字生活:如何转变为一个个0和1?
- phpmyadmin 修改记录(不断更新)
- python PIL图片拼接
- Python文件读取
- CAS和自旋到底是一个概念吗?
- IEEE754标准转换
- 记微信开发者工具登录网络连接失败