springboot環(huán)境切換失效
概述
最近在使用-Dspring.profiles.active=te 來(lái)切換spring-boot的環(huán)境時(shí),發(fā)現(xiàn)日志打印的是:
1
2
|
...ApplicationStartUp - The following profiles are active: de |
也就是說(shuō),參數(shù)失效了。
debug調(diào)試時(shí),發(fā)現(xiàn)spring-boot讀取的也是de,不是te。
解決
下載了一個(gè)新的tomcat,然后重新發(fā)布程序,設(shè)置參數(shù),啟動(dòng),發(fā)現(xiàn)環(huán)境正常切換了過(guò)來(lái)。
SpringBoot多數(shù)據(jù)源切換無(wú)效(不切換)
SpringBoot的多數(shù)據(jù)源實(shí)現(xiàn)以實(shí)現(xiàn)AbstractRoutingDataSource#determineCurrentLookupKey()來(lái)達(dá)到多個(gè)數(shù)據(jù)源動(dòng)態(tài)切換的目的。
網(wǎng)上有很多的文章可以獲取具體方法,就不在講了。
項(xiàng)目中需要用到多數(shù)據(jù)源MySQL和SQLServer兩個(gè)數(shù)據(jù)庫(kù),系統(tǒng)要保持兩個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)同步,就需要來(lái)回切數(shù)據(jù)源來(lái)操作數(shù)據(jù)庫(kù)。
剛寫(xiě)好了數(shù)據(jù)從MySQL同步到SQLServer中的代碼,測(cè)試發(fā)現(xiàn)數(shù)據(jù)源不能切換到SQLServer數(shù)據(jù)庫(kù)連接,排查問(wèn)題~~省略n多個(gè)小時(shí)后,
源碼解析等理論就不寫(xiě)了(重要的是不會(huì)寫(xiě))直接上修改方案
CSDN查到的方案有
- 數(shù)據(jù)源切換和事務(wù)的注入順序問(wèn)題,像下面這樣的,加入@Order注解。測(cè)試無(wú)效(可能我搭的架構(gòu)有問(wèn)題)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@Aspect @Slf4j @Order (- 1 ) // 保證優(yōu)先級(jí) @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)層切換數(shù)據(jù)源,反正我沒(méi)找到怎么個(gè)用法,所以沒(méi)有測(cè)試。
- 還有下面的這種寫(xiě)法。測(cè)試有效的
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的數(shù)據(jù)對(duì)象:[{}]" , record); } ...... // 這種調(diào)用保存數(shù)據(jù)的方法,有效切換數(shù)據(jù)源 XXXService service = SpringContextHolder.getBean(XXXService. class ); return service.saveHeader(record); } @DataSource (DatasourceEnum.DB3) public int saveHeader(XXXEntity record) { return xxxMapper.insertSelective(record); } |
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/limenghua9112/article/details/79608257