首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Spring MVC 實現 Service 層動態切換多資料源:AOP + AbstractRoutingDataSource 實戰

     編輯:程式設計疑難解答

架構設計

目標:日志與生產業務使用不同資料源,Service 層透明切換。

核心組件

  1. DynamicDataSource 繼承 AbstractRoutingDataSource:
    public class DynamicDataSource extends AbstractRoutingDataSource {
        @Override
        protected Object determineCurrentLookupKey() {
            return DatabaseContextHolder.getCustomerType();
        }
    }
  2. DatabaseContextHolder 基於 ThreadLocal 存儲當前資料源標識:
    public class DatabaseContextHolder {
        private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
        public static void setCustomerType(String type) { contextHolder.set(type); }
        public static String getCustomerType() { return contextHolder.get(); }
        public static void clearCustomerType() { contextHolder.remove(); }
    }
  3. DataSourceInterceptor(AOP 切面):
    @Aspect
    @Component
    public class DataSourceInterceptor {
        @Before("execution(* com.service.log.*.*(..))")
        public void setLogDataSource() { DatabaseContextHolder.setCustomerType("dataSourceTwo"); }
    
        @Before("execution(* com.service.prod.*.*(..))")
        public void setProdDataSource() { DatabaseContextHolder.setCustomerType("dataSourceOne"); }
    
        @After("execution(* com.service.*.*.*(..))")
        public void clear() { DatabaseContextHolder.clearCustomerType(); }
    }
  4. Spring 配置:定義兩個 DataSource Bean,注入 DynamicDataSource 作為默認 dataSource。

事務邊界注意

若在同一事務中跨資料源操作,需使用 JTA (Atomikos/Bitronix) 或避免跨庫事務。本方案適用於「單一事務內單一資料源」場景。

驗證方式

在 Service 方法入口打印 DatabaseContextHolder.getCustomerType() 確認切換生效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved