1、在spring配置文件中加入以下配置
<!-- 多数据源配置 -->
<bean id="dataSource"
class="com.wangku.wjf.common.datasource.TradingRoutingDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
</map>
</property>
<!-- common里只定义一个默认数据源 -->
<property name="defaultTargetDataSource" ref="default.dataSource"></property>
</bean>
2、TradingRoutingDataSource类如下:
public class TradingRoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return TradingDataSourceHolder.getThreadDataSource();
}
@Override
public void setTargetDataSources(Map<Object, Object> targetDataSources) {
super.setTargetDataSources(targetDataSources);
afterPropertiesSet();
}
}
3、TradingDataSourceHolder定义如下:
public class TradingDataSourceHolder {
protected static final Logger logger = LoggerFactory.getLogger(TradingDataSource.class);
private static final ThreadLocal<String> threadDataSource = new ThreadLocal<String>();
public static String getThreadDataSource() {
String dataSourceName = (String) threadDataSource.get();
if (dataSourceName != null) {
logger.info("DataSource Name:[" + dataSourceName + "]");
}
return threadDataSource.get();
}
public static void setThreadDataSource(String dataSourceName) {
threadDataSource.set(dataSourceName);
}
4、定义BeanPostPrcessorImpl,代码如下:
public class BeanPostPrcessorImpl implements BeanPostProcessor {
@Autowired
private TradingRoutingDataSource tradingRoutingDataSource;
private static Map<Object,Object> _targetDataSources =new HashMap<Object, Object>();
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
if(bean instanceof BasicDataSource){
_targetDataSources.put(beanName, bean);
tradingRoutingDataSource.setTargetDataSources(_targetDataSources);
}
return bean;
}
}
5、自定义注解切换数据源:
@Retention(RetentionPolicy.RUNTIME)
public @interface TradingDataSource {
String name();
}
6、AOP解析注解,实现切换:
@Aspect
@Component
public class TradingDataSourceAdvice implements Ordered {
@Pointcut("execution(* com.xxx.*.service..*.*(..))")
private void serviceInvoke(){}
@Around("serviceInvoke()")
public Object interceptor(ProceedingJoinPoint pjp) throws Throwable {
//在类上找
TradingDataSource tradingDataSource = pjp.getTarget().getClass().getAnnotation(TradingDataSource.class);
if (tradingDataSource == null) {
//在方法上找
String methodName = pjp.getSignature().getName();
tradingDataSource = pjp.getTarget().getClass().getMethod(methodName).getAnnotation(TradingDataSource.class);
}
if (tradingDataSource != null) {
//如果检测到需要切换,则进行处理
TradingDataSourceHolder.setThreadDataSource(tradingDataSource.name());
}
Object object = pjp.proceed();
if(tradingDataSource != null) {
//切换后清除
TradingDataSourceHolder.clearThreadDataSource();
}
return object;
}
public int getOrder() {
return 100;
}
}
相关推荐
SpringBoot2.x 继承 AbstractRoutingDataSource 动态数据源切换实现 JPA读写分离。 使用MyCat代理MySQL8数据库,添加root账户(读写)和user账户(只读)模拟读写简单分离。
springboot+mybatis+mysql+AbstractRoutingDataSource实现多数据源切换(一写多读数据源)项目中包含完整的demo案例配备文档说明,亲测可用;实现简单,代码思路清晰.
综上所述,"spring+druid+AtomikosDataSource"的组合为开发者提供了一套强大的工具,用于实现多数据源切换和分布式事务控制。在实际项目中,通过合理的配置和编码,可以构建出高效、健壮的分布式系统。在`mult-table...
【Spring 动态数据源切换】使用 `AbstractRoutingDataSource` 的详细实现在处理多数据库环境时,Spring 提供了一个强大的工具 `AbstractRoutingDataSource`,它允许我们根据特定条件动态地切换数据源。本文将深入...
以下是如何使用`AbstractRoutingDataSource` 来实现数据源切换的步骤: 1. **创建自定义数据源路由类**: 首先,你需要创建一个类继承自`AbstractRoutingDataSource`,并覆盖`determineCurrentLookupKey()` 方法。...
4. **动态数据源切换**:对于MyBatis,可以在SqlSessionTemplate中设置数据源,或者使用`@MapperScan`注解配合自定义数据源路由类来实现。 **六、实战项目分析** 在`springboot-multi-datasource-master`项目中,...
- AOP切面的Java类,实现了方法执行前后的拦截和数据源切换。 - 数据源相关的Java配置类,用于配置Spring的DataSource和MybatisPlus。 - Mapper接口和对应的XML文件,定义数据库操作。 - 业务逻辑层的Java类,其中的...
在数据源切换的场景中,Druid可以作为中间层,管理多个数据库连接,并根据配置或编程方式实现动态数据源切换,确保业务在不同数据库间平滑过渡。 实现数据源切换的步骤通常包括以下几个方面: 1. **配置多数据源**...
总结起来,使用`ThreadLocal`和`AbstractRoutingDataSource`实现动态数据源切换的关键步骤包括: 1. 创建`ThreadLocal`实例来保存线程的数据源信息。 2. 实现`AbstractRoutingDataSource`,并重写`...
本教程将详细介绍如何在Spring Boot项目中整合Druid数据源池与Mybatis,实现多数据源切换的功能,并提供一个亲测可用的解决方案。 首先,让我们了解Spring Boot、Druid和Mybatis这三大组件的基础知识: **Spring ...
本示例主要讲解如何使用Spring Boot结合MyBatis实现多数据源切换,并确保AOP事务管理仍然有效。 首先,我们需要配置多数据源。在Spring Boot中,可以使用`DataSource`接口的实现类,如`HikariCP`或`Druid`,创建两...
4. 配置数据源切换:在`@Configuration`注解的类中,使用`@Bean`注解创建一个`PrimaryDataSourceBean`和`SecondaryDataSourceBean`,返回DruidDataSource实例。同时,创建一个`DataSource`的`@Bean`,返回`...
多数据源切换的核心在于动态选择和切换数据源,这通常通过配置或编程方式实现。在Java中,我们可以利用Spring框架的强大功能来轻松实现这一目标。Spring提供了多种数据源切换的解决方案,如...
通过以上步骤,我们就实现了MyBatis与Spring配合下的动态数据源切换。这种机制有助于在多租户系统、读写分离或者高可用架构中灵活地管理数据库访问,提高了系统的可扩展性和灵活性。在实际应用中,还需要考虑数据源...
**多数据源切换** 的实现通常涉及配置多个DataSource实例,每个实例对应一个数据库。在Spring中,可以通过AbstractRoutingDataSource类来动态选择数据源。这个类可以根据某种上下文信息(如事务标识、请求参数等)来...
这可以通过监听数据库表的变化,获取最新的数据源配置,然后通过Spring的`DataSourceProxy`或`AbstractRoutingDataSource`实现动态数据源切换。 3. **数据库方言动态切换** Sharding-JDBC支持多种数据库,如MySQL...
本文将深入探讨如何在Spring Boot项目中实现Atomikos分布式事务以及动态数据源切换的两种示例。 首先,我们需要理解什么是分布式事务。在分布式系统中,事务需要跨越多个独立的数据库或服务进行操作。分布式事务的...
通过以上知识点,我们可以理解动态数据源在Java和SpringMVC项目中的作用,以及如何实现在运行时切换多个固定数据源的策略。在实际开发中,结合`multiDbDemo1`中的代码示例,可以更好地理解和应用这些概念。
总结来说,动态切换数据源是大型分布式系统中不可或缺的功能,通过Spring的`AbstractRoutingDataSource`和适当的配置,我们可以轻松地在SSM框架下实现这一功能,从而更好地管理和扩展我们的应用程序。
我们可以扩展`AbstractRoutingDataSource`,重写`determineCurrentLookupKey`方法来实现自己的数据源切换逻辑。 在实际开发中,我们还需要考虑数据源的切换策略。比如,对于读操作,可以采用轮询、随机或者根据负载...