您的位置:首页 > 编程语言 > Java开发

spring boot 进行读写分离

2016-07-06 07:46 288 查看

配置多数据源

writeDB

write.datasource.url:
write.datasource.username:
write.datasource.password: a
write.datasource.driver-class-name:
write.datasource.max-active: 5
write.datasource.max-idle: 3
write.datasource.min-idle: 2
write.datasource.max-wait: 60000
write.datasource.validation-query: select NOW()
write.datasource.test-while-idle: true

readDB

read.datasource.url:
read.datasource.username:
read.datasource.password:
read.datasource.driver-class-name: com.mysql.jdbc.Driver
read.datasource.max-active: 5
read.datasource.max-idle: 3
read.datasource.min-idle: 2
read.datasource.max-wait: 60000
read.datasource.validation-query: select NOW()
read.datasource.test-while-idle: true

设置动态数据源

<bean id="dynamicDataSource" class="com.freeworker.config.db.DynamicDataSource" primary="true">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="readDataSource" value-ref="readDataSource"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="writeDataSource"/>
</bean>

public class DynamicDataSource extends AbstractRoutingDataSource{

@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceHolder.getDataSource();
}

}

public class DynamicDataSourceHolder {

private static final ThreadLocal<String> dataSources = new ThreadLocal<String>();

public static void setDataSource(String customerType) {
dataSources.set(customerType);
}

public static String getDataSource() {
return (String) dataSources.get();
}

public static void clearDataSource() {
dataSources.remove();
}
}

使用AOP进行数据源切换

@Aspect
@Component
public class DynamicDataSourceAspect {

@Around("execution(public * com.freeworker.service..*.*(..))")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
Method targetMethod = methodSignature.getMethod();
if(targetMethod.isAnnotationPresent(TargetDataSource.class)){
String targetDataSource = targetMethod.getAnnotation(TargetDataSource.class).name() ;
DynamicDataSourceHolder.setDataSource(targetDataSource);
}

Object result = pjp.proceed();

DynamicDataSourceHolder.clearDataSource();

return result;
}
}

设置注解

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TargetDataSource {
String name();
}

@Service
public class AppService implements IAppService{
@TargetDataSource(name="writeDataSource")
public DataValue<AppConfigVo> getAppConfig() {}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring boot 读写分离