解決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。

推薦閱讀: