首先配置2个数据库连接
driverClassName=com.mysql.jdbc.Driver
validationQuery=SELECT 1
#chemical库
jdbc_chemical_url=jdbc:mysql://localhost:3306/abies?useUnicode=true&characterEncoding=utf8
jdbc_chemical_username=root
jdbc_chemical_password=root
#user库
jdbc_user_url=jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf8
jdbc_user_username=root
jdbc_user_password=root
到xml的配置文件中配置两个数据源 基本上都一样
重点来了
<bean id="multipleDataSource" class="radium.servlet.chemical.utility.MultipleDataSource">
<!-- 默认使用 -->
<property name="defaultTargetDataSource" ref="chemicalDS" />
<property name="targetDataSources">
<map>
<entry key="chemicalDS" value-ref="chemicalDS" />
<entry key="userDS" value-ref="userDS" />
</map>
</property>
</bean>
创建一个multipleDataSource,具体代码
public class MultipleDataSource extends AbstractRoutingDataSource {
private static final ThreadLocal<String> dataSourceKey = new InheritableThreadLocal<String>();
public static void setDataSourceKey(String dataSource) {
dataSourceKey.set(dataSource);
}
@Override
protected Object determineCurrentLookupKey() {
return dataSourceKey.get();
}
}
顺便把mybatis和事物配置改过了
根据业务需要,经常要操作不同的数据库,所以要动态的切换数据源,这里我使用spring aop,简单粗暴
首先加上aop注解声明
<aop:aspectj-autoproxy />
@Component
@Aspect
public class MultipleDataSourceAspectAdvice {
@Around("execution(* radium.servlet.chemical.mapper.*.*(..))")
public Object doAround(ProceedingJoinPoint jp) throws Throwable {
if (jp.getTarget() instanceof UserMapper) {
System.err.println("user------------");
MultipleDataSource.setDataSourceKey("userDS");
} else {
System.err.println("chemical------------");
MultipleDataSource.setDataSourceKey("chemicalDS");
}
return jp.proceed();
}
}