springboot環境切換失效
概述
最近在使用-Dspring.profiles.active=te 來切換spring-boot的環境時,發現日志打印的是:
1
2
|
...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注解。測試無效(可能我搭的架構有問題)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@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)層切換數據源,反正我沒找到怎么個用法,所以沒有測試。
- 還有下面的這種寫法。測試有效的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@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); } |
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/limenghua9112/article/details/79608257