我主要配合分表分庫的場景使用spring
多租戶
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
List<ISqlParser> sqlParserList = new ArrayList<>();
TenantSqlParser tenantSqlParser = new TenantSqlParser();
tenantSqlParser.setTenantHandler(new TenantHandler() {
@Override
public Expression getTenantId(boolean where) {
// 該 where 條件 3.2.0 版本開始添加的,用於分區是否爲在 where 條件中使用
// 此判斷用於支持返回多個租戶 ID 場景,具體使用查看示例工程
return new LongValue(1L); /// 多租戶的字段值,能夠從緩存獲取
}sql
@Override
public String getTenantIdColumn() {
return "tenant_id"; // 多租戶的列名
}緩存
@Override
public boolean doTableFilter(String tableName) {
// 這裏能夠判斷是否過濾表
/*
if ("user".equals(tableName)) {// 根據表名判斷是否過濾,true 排除解析
return true;
}*/
return false;
}
});
sqlParserList.add(tenantSqlParser);
paginationInterceptor.setSqlParserList(sqlParserList);
paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
@Override
public boolean doFilter(MetaObject metaObject) {
MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);
// 過濾自定義查詢此時無租戶信息約束【 麻花藤 】出現
if ("com.baomidou.springboot.mapper.UserMapper.selectListBySQL".equals(ms.getId())) {// 根據方法名判斷是否過濾,true 排除解析
return true;
}
return false;
}
});
return paginationInterceptor;
}springboot
多租戶在單表查詢下會自動帶上多租戶的列名與多租戶的字段值,在分表分庫的狀況下與shareding 配合使用能夠簡化流程app
樂觀鎖ide
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}.net
2.註解實體字段 @Version 必需要!
@Version
private Integer version;get
支持的數據類型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
整數類型下 newVersion = oldVersion + 1
newVersion 會回寫到 entity 中
僅支持 updateById(id) 與 update(entity, wrapper) 方法
在 update(entity, wrapper) 方法下, wrapper 不能複用!!!it
int id = 100;
int version = 2;io
User u = new User();
u.setId(id);
u.setVersion(version);
u.setXXX(xxx);
if(userService.updateById(u)){
System.out.println("Update successfully");
}else{
System.out.println("Update failed due to modified by others");
}
update tbl_user set name = 'update',version = 3 where id = 100 and version = 2
多租戶與樂觀鎖根據本身的業務場景能夠配合分表分庫使用,重構攔截器調整