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() {} }
相关文章推荐
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- Spring和ThreadLocal
- Spring Boot 开发微服务
- Spring AOP动态代理-切面
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- 电脑硬件分析Ultimate Boot CD v4.1.1 下载
- 模拟Spring的简单实现
- Spring整合WebSocket应用示例(上)
- spring+html5实现安全传输随机数字密码键盘
- Spring中属性注入详解
- 监听器获取Spring配置文件的方法
- Java利用Sping框架编写RPC远程过程调用服务的教程