博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring配置多数据源过程
阅读量:6027 次
发布时间:2019-06-20

本文共 2203 字,大约阅读时间需要 7 分钟。

这里使用AOP拦截注解来切换数据源。

1.    在数据源配置文件context.xml中增加新的数据源信息,使存在多个数据库服务可以访问。注意区别开jndi名称。
2.    在spring配置文件(一般是spring.xml)中增加新数据源的连接配置。
3.    新建多数据源类(比如MultipleDataSource.java),需要继承自org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource
a)    增加静态属性用来保存数据源信息。因为线程间不需要访问对方的数据源,这里使用ThreadLocal保存各线程的数据源信息

private static final ThreadLocal
dataSourceKey

 b)    重写determineCurrentLookupKey()方法。该方法是spring jdbc用来从targetDataSources中查找数据源的,如果返回为null, 则使用defaultTargetDataSource指定的默认数据源(这些属性在第4步配置)

@Override	protected Object determineCurrentLookupKey() {		return dataSourceKey.get();	}

 c)    增加静态设置方法,用于给当前线程设置数据源

public static void setDataSourceKey(String dataSource) {		dataSourceKey.set(dataSource);	}

 d)    增加静态清除方法,用于给无注解方法使用默认数据源

public static void toDefault(){		dataSourceKey.remove();	}

 4.    在spring.xml增加多数据源类的bean

 a)    配置属性defaultTargetDataSource,ref值为几个数据库连接中的某一个。当没有指定数据源时,默认使用该连接。

b)    配置属性targetDataSources,map的条目key自由定义,用来识别不同的数据源,value-ref指向对应的数据库连接。
6.    新增注解类,需要包含一个字符串属性,由于结合AOP所以要指定反射期可用,同时该注解作用于方法上:

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface BiDSChoicer {	String dsName();}

 7.    新建一个AOP通知类,我们要在方法执行以前先切换数据源,所以要实现org.springframework.aop.MethodBeforeAdvice接口,重写before(Method method, Object[] args, Object target)方法:

@Override	public void before(Method method, Object[] args, Object target) throws Throwable {		BiDSChoicer annotation = method.getAnnotation(BiDSChoicer.class);		if (annotation != null)	FossMultipleDataSource.setDataSourceKey(annotation.dsName());		else			FossMultipleDataSource.toDefault();	}

 8.    由于接口实现配置了事务管理,事务的优先级会高于数据源切换。一旦事务开启,再切换数据源是无效的,所以这里需要修改它们的次序

a)    通知类要实现org.springframework.core.Ordered接口,并重写getOrder()方法,令其返回1;

@Override	public int getOrder() {		return 1;	}

 b)    事务的配置中增加order为2

 这样,Spring会优先执行通知类方法,之后再开启事务。

9.    在需要切换数据源的接口方法上(必须是接口里的方法,在实现方法上无效)增加注解@BiDSChoicer(dsName="dsname"),属性值必须是配置的targetDataSources属性的条目key。
10.    在spring.xml里面新建通知类的bean,假设id是advice
11.    定义切入点,expression属性要根据情况具体修改,指向实现类

 12.    定义通知者

 这样配置以后,需要修改数据源的接口方法只要在其上增加注解即可。AOP拦截方法后会先对数据源进行设置,有注解的根据注解属性设置,没有注解的设置为使用默认数据源。对于AOP不拦截的则使用默认数据源。

转载地址:http://nnkhx.baihongyu.com/

你可能感兴趣的文章
微信小程序初体验(上)- 腾讯ISUX社交用户体验设计成员出品
查看>>
SAP WM Physical Inventory Method ST & PZ
查看>>
一次快速的数据迁移感悟
查看>>
MySQL修改提示符
查看>>
《ELK Stack权威指南(第2版)》一3.6 Java日志
查看>>
C++流的streambuf详解及TCP流的实现
查看>>
《量化金融R语言初级教程》一2.5 协方差矩阵中的噪声
查看>>
mysql到elasticsearch数据迁移踩坑实践-Ali0th
查看>>
Python轻量级数据分析库DaPy
查看>>
beetl 和 shrio 结合
查看>>
相对/绝对路径,cd命令,mkdir/rmdir命令,rm命令
查看>>
tomcat中web.xml各配置项的意义
查看>>
Nodejs学习笔记(二):《node.js开发指南》代码中需要注意的几点
查看>>
Ztree异步加载自动展开节点
查看>>
反射操作公共成员变量
查看>>
Android热修复升级探索——代码修复冷启动方案
查看>>
学校宿舍的深夜之思考
查看>>
VB.NET 生成DBF文件
查看>>
编译安装nginx 1.9.15
查看>>
我的友情链接
查看>>