背景
spring mvc 多数据源还有一种实现方式,利用 AOP 进行手动切换。
基本原理是,我们自己定义一个 DataSource 类 DynamicDataSource ,来继承 AbstractRoutingDataSource ,然后在配置文件中向 DynamicDataSource 注入两个数据源,然后通过 AOP 来灵活配置。
配置文件
applicationContext.xml
1 | <jee:jndi-lookup id="dataSource" jndi-name="java:jboss/datasources/data"></jee:jndi-lookup> |
可以看到,上面配置了两个数据源,分别是 dataSource , dataSource2 。配置了一个自定义的 dynamicDataSource 类,注入了这两个数据源。最后配置了一个 AOP 切面 manyDataSourceAspect 。对 services 下面的类增加了切点。
DynamicDataSource.java
1 | public class DynamicDataSource extends AbstractRoutingDataSource { |
这个 DynamicDataSource 继承自 AbstractRoutingDataSource ,重写了 determineCurrentLookupKey , 默认使用了第一个数据源。
DBContextHolder.java
1 | public class DBContextHolder { |
DBContextHolder 类提供了三个方法,获取数据源,设置数据源,清理数据源。
DataSourceType.java
1 | (RetentionPolicy.RUNTIME) |
增加一个接口,可以通过注解方式切换数据源。
DataSourceAspect.java
1 | public class DataSourceAspect { |
这是一个切面,在进入方法前,设置数据源,退出方法后,清空数据源。
使用
在需要手动切换数据源的方法上,加上注解。1
(DataSourceType.DB_TYPE_SECOND)
也可以手动加入代码,在指定位置切换数据源。1
2
3DBContextHolder.setDbType(DB_TYPE_SECOND);
Integer count = jdbcTemplate.queryForObject("select count(*) from th_demo_field",Integer.class);
System.out.println(count);
由于增加了切面,方法结束后就会清理数据源,因此不会对其它地方产生影响。