MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects, 普通的 Java 对象)映射成数据库中的记录。
多数据源切换是指在一个应用中同时使用多个数据库,并且能够根据业务需求灵活地在这些数据库之间进行切换。MyBatis 提供了多种方式来实现多数据源切换,常见的有:
以下是一个简单的基于 Spring 和 MyBatis 的多数据源切换示例:
@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceContextHolder.getDataSourceKey();
}
}
public class DynamicDataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSourceKey(String key) {
contextHolder.set(key);
}
public static String getDataSourceKey() {
return contextHolder.get();
}
public static void clearDataSourceKey() {
contextHolder.remove();
}
}
@Aspect
@Component
public class DataSourceAspect {
@Around("@annotation(com.example.annotation.TargetDataSource)")
public Object around(ProceedingJoinPoint point) throws Throwable {
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
TargetDataSource dataSource = method.getAnnotation(TargetDataSource.class);
if (dataSource != null) {
DynamicDataSourceContextHolder.setDataSourceKey(dataSource.value());
}
try {
return point.proceed();
} finally {
DynamicDataSourceContextHolder.clearDataSourceKey();
}
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TargetDataSource {
String value();
}
问题:数据源切换不生效。 原因:可能是 AOP 切面没有正确拦截到方法调用,或者数据源上下文没有正确设置。 解决方法:
通过以上步骤,可以实现 MyBatis 的多数据源切换,并根据实际需求灵活应用到不同的场景中。
领取专属 10元无门槛券
手把手带您无忧上云