Spring 多資料來源 AOP 動態切換
一:新增多資料來源類
二:新增註解
三:新增AOP切面
四:資料來源配置
五:應用舉例
點選(此處)摺疊或開啟
-
public class DynamicDataSource extends AbstractRoutingDataSource {
-
-
@Override
-
protected Object determineCurrentLookupKey() {
-
return DataSourceContextHolder.getDataSource();
-
}
-
- }
點選(此處)摺疊或開啟
-
public class DataSourceContextHolder {
-
-
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
-
-
public static void setDataSource(String dataSource) {
-
contextHolder.set(dataSource);
-
}
-
-
public static String getDataSource() {
-
return contextHolder.get();
-
}
-
- }
二:新增註解
點選(此處)摺疊或開啟
-
@Retention(RetentionPolicy.RUNTIME)
-
@Target(ElementType.METHOD)
-
@Documented
-
public @interface DataSource {
-
String value();
- }
三:新增AOP切面
點選(此處)摺疊或開啟
-
@Aspect
-
@Component
-
public class DataSourceAspect {
-
-
@Pointcut("@annotation(com.gemdale.ghome.business.async.deal.center.demo.datasource.DataSource)")
-
public void dataSourcePointCut() {
-
};
-
-
@Before("dataSourcePointCut()")
-
public void before(JoinPoint joinPoint) {
-
-
System.out.println("=============dataSourcePointCut:before=============");
-
-
Object target = joinPoint.getTarget();
-
String method = joinPoint.getSignature().getName();
-
-
// Class<?>[] classz = target.getClass().getInterfaces();
-
Class<?> classz = target.getClass();
-
Class<?>[] parameterTypes = ((MethodSignature) joinPoint.getSignature()).getMethod().getParameterTypes();
-
-
try {
-
// Method m = classz[0].getMethod(method, parameterTypes);
-
Method m = classz.getMethod(method, parameterTypes);
-
if (null != m && m.isAnnotationPresent(DataSource.class)) {
-
DataSource dataSource = m.getAnnotation(DataSource.class);
-
DataSourceContextHolder.setDataSource(dataSource.value());
-
-
System.out.println("=============dataSource:" + dataSource.value());
-
}
-
}
-
catch (Exception e) {
-
e.printStackTrace();
-
}
-
}
-
- }
四:資料來源配置
點選(此處)摺疊或開啟
-
@Configuration
-
public class DynamicTransactionManagerElConfig {
-
-
@Autowired
-
@Qualifier("platformTomcat")
-
private DataSource platformTomcat;
-
-
@Autowired
-
@Qualifier("platformReadTomcat")
-
private DataSource platformReadTomcat;
-
-
@Bean(name = "dataSource")
-
public DynamicDataSource dataSource() {
-
DynamicDataSource dataSource = new DynamicDataSource();
-
Map<Object, Object> targetDataSources = new HashMap<>();
-
targetDataSources.put("master", platformTomcat);
-
targetDataSources.put("slave", platformReadTomcat);
-
dataSource.setTargetDataSources(targetDataSources);
-
dataSource.setDefaultTargetDataSource(platformTomcat);
-
return dataSource;
-
}
-
-
-
@Bean(name = "jdbcTemplate")
-
public JdbcTemplate jdbcTemplate(DynamicDataSource dataSource) {
-
JdbcTemplate jdbcTemplate = new JdbcTemplate();
-
jdbcTemplate.setDataSource(dataSource);
-
return jdbcTemplate;
-
}
-
-
@Bean(name = "jdbcReadTemplate")
-
public JdbcTemplate jdbcReadTemplate(DynamicDataSource dataSource) {
-
JdbcTemplate jdbcReadTemplate = new JdbcTemplate();
-
jdbcReadTemplate.setDataSource(dataSource);
-
return jdbcReadTemplate;
-
}
-
-
-
@Bean(name = "transactionManager")
-
public DataSourceTransactionManager transactionManager(DynamicDataSource dataSource) {
-
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
-
transactionManager.setDataSource(dataSource);
-
return transactionManager;
-
}
-
- }
五:應用舉例
點選(此處)摺疊或開啟
-
@Service("gmcSmsInfoBo")
-
public class GmcSmsInfoBo extends AbstractBusinessObject {
-
-
@Autowired
-
private GmcSmsInfoDAO gmcSmsInfoDaoImpl;
-
-
// @CachePut(value = "GmcSmsInfoCache", key = "'GmcSmsInfo_'+#result.smsId")
-
// @Transactional(rollbackFor={Exception.class,RuntimeException.class})
-
@DataSource("master")
-
public GmcSmsInfo add(GmcSmsInfo smsInfo) throws BusinessServiceException {
-
System.out.println("=============add==========");
-
try {
-
smsInfo.setSmsId(gmcSmsInfoDaoImpl.save(smsInfo));
-
}
-
catch (FrameworkDAOException e) {
-
throw new BusinessServiceException(e);
-
}
-
return smsInfo;
-
}
-
-
// @Cacheable(value="GmcSmsInfoCache",key="'GmcSmsInfo_'+#smsId")
-
@DataSource("slave")
-
public GmcSmsInfo query(Integer smsId) throws BusinessServiceException {
-
System.out.println("=============query==========");
-
try {
-
return gmcSmsInfoDaoImpl.findById(GmcSmsInfo.class, smsId);
-
}
-
catch (Exception e) {
-
throw new BusinessServiceException(e);
-
}
-
}
-
- }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2136769/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spring AOP動態切換資料來源Spring
- Spring實現多資料來源動態切換Spring
- mybatis 多資料來源動態切換MyBatis
- Spring Boot MyBatis 動態資料來源切換、多資料來源,讀寫分離Spring BootMyBatis
- 基於AOP的動態資料來源切換(附原始碼)原始碼
- spring-data-redis 動態切換資料來源SpringRedis
- spring+atomikos+mybatis 多資料來源事務(動態切換)SpringMyBatis
- SSM(八)動態切換資料來源SSM
- 專案要實現多資料來源動態切換,咋搞?
- Spring-Boot 多資料來源配置+動態資料來源切換+多資料來源事物配置實現主從資料庫儲存分離Springboot資料庫
- spring-boot-route(十)多資料來源切換Springboot
- Springboot通過AOP整合多資料來源,分析@Transaction切換資料來源不生效問題Spring Boot
- 30個類手寫Spring核心原理之動態資料來源切換Spring
- 30個類手寫Spring核心原理之動態資料來源切換(8)Spring
- 實現Spring動態註冊多資料來源Spring
- Spring Boot 動態資料來源(Spring 註解資料來源)Spring Boot
- Spring 4+atomikos+JdbcTemplate+DynamicDataSource 分散式事務資料來源動態切換SpringJDBC分散式
- AbstractRoutingDataSource 實現動態資料來源切換原理簡單分析
- spring框架中多資料來源建立載入並且實現動態切換的配置例項程式碼Spring框架
- 多資料來源與動態資料來源的權衡
- siebel切換資料來源【轉】
- 註解切換雙資料來源
- SpringBoot 這麼實現動態資料來源切換,就很絲滑!Spring Boot
- Spring多資料來源配置Spring
- Spring配置多資料來源Spring
- SpringBoot框架:通過AOP和自定義註解完成druid連線池的動態資料來源切換(三)Spring Boot框架UI
- Spring多資料來源獲取Spring
- Spring Boot 配置多資料來源Spring Boot
- Spring Boot 多資料來源配置Spring Boot
- Spring 註解動態資料來源設計實踐Spring
- SpringBoot2.x 多資料來源切換、druid監控、tkSpring BootUI
- @Transactional開啟事務導致AbstractRoutingDataSource動態資料來源無法切換的解決方案
- BIRT 如何配置動態資料來源
- Spring是如何支援多資料來源的Spring
- Spring多資料來源管理實現原理Spring
- highcharts 多資料+切換
- 聊聊如何利用apollo與druid整合實現資料來源動態熱切UI
- spring多資料來源下 事務不生效Spring