之前写过BeetlSQL3+多租户的实现方案,传送门:https://segmentfault.com/a/11...补充完善1:在初始化动态数据源时,直接构建SQLManager,这样通过工具类不需要每次拿到都构建。for(Tenantdto:tenantList){HikariDataSource数据源=newHikariDataSource();dataSource.setDriverClassName(dto.getDbDriver());dataSource.setJdbcUrl(dto.getDbUrl());数据源。setUsername(dto.getDbUsername());dataSource.setPassword(dto.getDbPassword());dataSource.setDataSourceProperties(master.getDataSourceProperties());dataSourceMap.put(dto.getTenantId(),dataSource);//构建SQLManager并将所有数据源注册到SQLManagerBuilder.sqlManagerMapConnectionSourcesource=ConnectionSourceHelper.getSingle(dataSource);SQLManagerBuilder构建器=newSQLManagerBuilder(source);builder.setNc(newUnderlinedNameConversion());builder.setInters(newInterceptor[]{newSqlDebugInterceptor()});建造者.setDbStyle(新的MySqlStyle());builder.setName(dto.getTenantId());建设者.建设();}//设置数据源dynamicDataSource.setDataSources(dataSourceMap);//执行生效dynamicDataSource.afterPropertiesSet();//获取SQLManager对象SQLManagerBuilder.sqlManagerMap.get(key);2:面向服务方法,手动管理事务@Component@Aspect@Order(-1)publicclassDSTransactionManagerAspect{privatestaticfinalLoggerlog=LoggerFactory.getLogger(DSTransactionManagerAspect.class);@Pointcut("execution(*com.test.service..*.*(..))")publicvoiddataSourceSwitchPointCut(){}@Around(value="@annotation(org.springframework.transaction.annotation.Transactional)")publicObjecthandler(ProceedingJoinPointpoint)throwsThrowable{Objectproceed=null;try{//开始事务DSTransactionManager.start();proceed=point.proceed();//提交交易DSTransac}catch(Exceptione){//回滚事务log.error(e.toString());DSTransactionManager.rollback();抛出新的异常(e);}最后{//清空DSTransactionManager。清除();}返回进行;}}
