1.如果每个租户一个数据库,如果有任何表结构变动,维护起来很麻烦。
2.如果所有租户一个数据库,如果有任何表结构变动,维护起来很方便。
3.如果任何crud都手动筛选租户id,很麻烦。
我的想法是拦截sql,然后解析sql,自动加上租户字段的筛选。
不知道有什么好的开源项目可以直接使用。
1.如果每个租户一个数据库,如果有任何表结构变动,维护起来很麻烦。
2.如果所有租户一个数据库,如果有任何表结构变动,维护起来很方便。
3.如果任何crud都手动筛选租户id,很麻烦。
我的想法是拦截sql,然后解析sql,自动加上租户字段的筛选。
不知道有什么好的开源项目可以直接使用。
在Spring Boot中实现多租户(Multi-Tenancy)时,确实需要考虑多种策略来平衡数据隔离、维护便利性和性能等因素。你提到的几种策略以及你的想法都是有效的方向,下面我会分别给出一些建议和可能的开源项目支持。
实现方式:
实现方式:
你的想法非常接近于使用AOP(面向切面编程)或数据库中间件来实现SQL的拦截与解析,自动添加租户ID筛选条件。
实现方式:
根据你的需求,如果追求数据的高度隔离且可以接受较高的维护成本,可以选择每个租户一个数据库的策略。如果希望简化数据库管理和表结构变更的维护,可以考虑所有租户一个数据库并使用AOP或数据库中间件来自动处理租户ID的筛选。Apache ShardingSphere是一个值得考虑的开源项目,它提供了灵活的数据分片策略和SQL改写功能,非常适合用于多租户场景。
想是直接手写sql mapper不太好搞,如果是用java代码封装sql不是直接在xml写sql,则简单多了,取当前用户的租户号,自动加上查询tenant_code=当前用户租号. 比如mybatis-plus由于有可以用java代码来写sql,则很容易做到.
15 回答6.9k 阅读
2 回答3.3k 阅读✓ 已解决
3 回答7k 阅读✓ 已解决
3 回答3.1k 阅读✓ 已解决
5 回答4.7k 阅读
3 回答5.2k 阅读
4 回答2.3k 阅读
是的,可以拦截 SQL 并处理。MyBais-Plus 提供了多租户的组件,只需要实现拦截器即可达到你的预期。
但实际上,多租户影响的点不止是关系数据库而已。
比如你的项目是微服务,或者需要使用第三方的服务,那么是不是还需要把租户标识传递下去?如果你的存储不止是关系数据库,使用了 Redis、MongoDB 等,是不是也要在中间件的交互上也携带租户标识?
对于三方服务,尚可以在请求交互时使用 OkHttp 的拦截器来在请求之前在头中置入租户标识。可是 Redis、MongoDB 或是 ES 等,目前我是没发现好的办法。