1、db.properties文件的配置
jdbc.dataSourceOne.driver =com.mysql.jdbc.Driver
jdbc.dataSourceOne.url =jdbc:mysql://localhost:3306/test
jdbc.dataSourceOne.username =root
jdbc.dataSourceOne.password =123456
jdbc.dataSourceTwo.driver =com.mysql.jdbc.Driver
jdbc.dataSourceTwo.url =jdbc:mysql://localhost:3306/testtwo
jdbc.dataSourceTwo.username =root
jdbc.dataSourceTwo.password =123456
2、数据源的配置即applicationContext.xml的配置
<!-- 加载配置文件 -->
< context :property-placeholder location ="classpath:db.properties" />
<!-- 数据库连接池 -->
< bean id ="dataSource" class ="org.apache.commons.dbcp.BasicDataSource"
destroy-method ="close" >
< property name ="driverClassName" value ="${jdbc.dataSourceOne.driver}" />
< property name ="url" value ="${jdbc.dataSourceOne.url}" />
< property name ="username" value ="${jdbc.dataSourceOne.username}" />
< property name ="password" value ="${jdbc.dataSourceOne.password}" />
< property name ="maxActive" value ="10" />
< property name ="maxIdle" value ="5" />
</ bean >
< bean id ="dataSourceTwo" class ="org.apache.commons.dbcp.BasicDataSource" destroy-method ="close" >
< property name ="driverClassName" value ="${jdbc.dataSourceTwo.driver}" />
< property name ="url" value ="${jdbc.dataSourceTwo.url}" />
< property name ="username" value ="${jdbc.dataSourceTwo.username}" />
< property name ="password" value ="${jdbc.dataSourceTwo.password}" />
< property name ="maxActive" value ="10" />
< property name ="maxIdle" value ="5" />
</ bean >
<!--common.mutipleDataSource.MutipleDataSource 自己编写的类 下面会给出实现 -->< bean id ="multipleDataSource" class ="common.mutipleDataSource.MutipleDataSource" > < property name ="defaultTargetDataSource" ref ="dataSourceTwo" /> < property name ="targetDataSources" > < map > < entry key ="dataSource" value-ref ="dataSource" /> < entry key ="dataSourceTwo" value-ref ="dataSourceTwo" /> </ map > </ property > </ bean > <!-- SqlsessionFactory --> < bean id ="sqlSessionFactory" class ="org.mybatis.spring.SqlSessionFactoryBean" > <!-- 数据源 --> < property name ="dataSource" ref ="multipleDataSource" /> <!-- mybatis配置文件 --> < property name ="configLocation" value ="classpath:mybatis/SqlMapConfig.xml" /> < property name ="mapperLocations" value ="classpath:mapping/*.xml" ></ property > <!--配置pojo包下的pojo类的别名 别名为:pojo类名的首字母大写或者小写--> < property name ="typeAliasesPackage" value ="pojo" /> </ bean > <!-- MapperScannerConfigurer:mapper的扫描器,将包下边的mapper接口自动创建代理对象, 自动创建到spring容器中,bean的id是mapper的类名(首字母小写) --> < bean class ="org.mybatis.spring.mapper.MapperScannerConfigurer" > < property name ="basePackage" value ="dao" /> <!-- 使用sqlSessionFactoryBeanName --> < property name ="sqlSessionFactoryBeanName" value ="sqlSessionFactory" /> </ bean > <!-- 使用自动代理扫描器 即使用注解 AspectJ common.multipleDataSourceAspectAdvice 自定义类 后面会给出具体实现
--> < context :component-scan base-package ="common.multipleDataSourceAspectAdvice" />
< aop :aspectj-autoproxy />
3、 common.mutipleDataSource.MutipleDataSource类的实现 public class MutipleDataSource extends AbstractRoutingDataSource {
private static final ThreadLocal<String> dataSourceKey = new Inheritabl eThreadLocal<String>();
public static void setDataSourceKey(String dataSource) {
dataSourceKey .set(dataSource);
} @Override
protected Object determineCurrentLookupKey() {
return dataSourceKey .get();
}
} 4、common.multipleDataSourceAspectAdvice 类的实现 @Component
@Aspect
public class MultipleDataSourceAspectAdvice {
@Around ("execution(* dao.*.*(..))" )//切入点选择在Dao层,之前选择了在service层出现了不能自动切换的情况,修改后正常使用
public Object doAround(ProceedingJoinPoint jp) throws Throwable {
Object obj = jp.getTarget();
boolean flag = jp.getTarget() instanceof UserMapper;
boolean flagTwo = jp.getTarget() instanceof UserMapperTwo;
if (jp.getTarget() instanceof UserMapper) {
MutipleDataSource.setDataSourceKey ("dataSource" );
} else if (jp.getTarget() instanceof UserMapperTwo) {
MutipleDataSource.setDataSourceKey ("dataSourceTwo" );
}
return jp.proceed();
}
}