解決springboot環境切換失效的問題
springboot環境切換失效
概述
最近在使用-Dspring.profiles.active=te 來切換spring-boot的環境時,發現日志打印的是:
...ApplicationStartUp - The following profiles are active: de
也就是說,參數失效瞭。
debug調試時,發現spring-boot讀取的也是de,不是te。
解決
下載瞭一個新的tomcat,然後重新發佈程序,設置參數,啟動,發現環境正常切換瞭過來。
SpringBoot多數據源切換無效(不切換)
SpringBoot的多數據源實現以實現AbstractRoutingDataSource#determineCurrentLookupKey()來達到多個數據源動態切換的目的。
網上有很多的文章可以獲取具體方法,就不在講瞭。
項目中需要用到多數據源MySQL和SQLServer兩個數據庫,系統要保持兩個數據庫的數據同步,就需要來回切數據源來操作數據庫。
剛寫好瞭數據從MySQL同步到SQLServer中的代碼,測試發現數據源不能切換到SQLServer數據庫連接,排查問題~~省略n多個小時後,
源碼解析等理論就不寫瞭(重要的是不會寫)直接上修改方案
CSDN查到的方案有
- 數據源切換和事務的註入順序問題,像下面這樣的,加入@Order註解。測試無效(可能我搭的架構有問題)
@Aspect @Slf4j @Order(-1) // 保證優先級 @Component public class DatasourceAspect { @Pointcut("@within(DataSource)|| @annotation(DataSource)") public void pointcut() { } @Before("pointcut() && @annotation(dataSource)") public void before(DataSource dataSource) { DatasourceContextHolder.setDatasource(dataSource.value().getDbName()); } @After("pointcut()") public void after() { DatasourceContextHolder.clear(); } }
- Mapper(Dao)層切換數據源,反正我沒找到怎麼個用法,所以沒有測試。
- 還有下面的這種寫法。測試有效的
@DataSource(DatasourceEnum.DB3) public int insertSelective( String hbNo, ) throws Exception{ CcpHeaderSqlServer record = new CcpHeaderSqlServer(); if (log.isDebugEnabled()) { log.debug("同步到SQLServer的數據對象:[{}]", record); } ...... // 這種調用保存數據的方法,有效切換數據源 XXXService service = SpringContextHolder.getBean(XXXService.class); return service.saveHeader(record); } @DataSource(DatasourceEnum.DB3) public int saveHeader(XXXEntity record) { return xxxMapper.insertSelective(record); }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Springboot動態切換數據源的具體實現與原理分析
- 基於 SpringBoot 實現 MySQL 讀寫分離的問題
- 關於MybatisPlus配置雙數據庫驅動連接數據庫問題
- Spring事務註解@Transactional失效的八種場景分析
- SpringBoot AOP @Pointcut切入點表達式排除某些類方式