问题背景
不久前收到一个需求,要求做两套一模一样的功能,这就要求进行数据隔离,通常的数据隔离方案有:
text
复制代码
独立数据库 共享数据库,独立Schema(如Oracle、DB2等) 共享数据库,共享 Schema,共享数据表
因为我们使用的Mysql
数据库,所以方案2
首先被排除,使用方案1
需引入多数据源组件,并新建数据库,因为这一个小功能分出两个库显然也有点儿大材小用,最终决定使用方案3
,落地方案为引入Mybatis-plus多租户插件。
注: 已知目前项目依赖的mybatis-plus
版本为3.1.2
, jsqlParser
版本为2.0
。
问题发生
因为我们是分布式架构,每个业务一个模块,而这个业务功能归属到一个已有模块业务,考虑到加入的多租户插件不能影响到同模块其他业务功能,因此进行了表过滤,多租户处理器相关代码如下:
然后Mybatis-plus配置里加入此处理器:
标2ProjectHandler
是上面提到的处理器,进行多租户表过滤,标1TenantSqlParser
依赖了此处理器,这个TenantSqlParser
大家注意下,后续分析原因会提到。
随后功能正常上线,但是上线后不久,发现同模块老功能的某个sql执行异常了,异常如下:
java
复制代码
Exception in thread net.sf.jsqlparser.JSQLParserException at net.sf.jsqlparser.parser.CCJSqlParserUtil.parseStatements(CCJSqlParserUtil.java:123) Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "left" "LEFT" at line 2, column 1. Was expecting one of: "," "SET" at net.sf.jsqlparser.parser.CCJSqlPa