版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011042955/article/details/51689449
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(); } }