springmvc 、mybatis整合多个数据源(读写分离)

来源:互联网 发布:地下城盗号软件2017 编辑:程序博客网 时间:2024/05/16 19:36

1、extends AbstractRoutingDataSource
此类注释:
Abstract {@link javax.sql.DataSource} implementation that routes {@link #getConnection()}
calls to one of various target DataSources based on a lookup key. The latter is usually
(but not necessarily) determined through some thread-bound transaction context.
大概意思就是getConnection()根据查找lookup key键对不同目标数据源的调用,通常是通过(但不一定)某些线程绑定的事物上下文来实现。

public class DynamicDataSource extends AbstractRoutingDataSource {    @Override    public Object determineCurrentLookupKey() {        // TODO Auto-generated method stub         return DataSourceContextHolder.getCustomerType();    }}

这里写图片描述

2、 上图2个方法分别是setTargetDataSources(注入目标数据源) 和setDefaultTargetDataSource(注入默认的数据源);
可在spring.xml配置

 <bean id="dynamicDataSource" class="com.xx.xx.DateSource.DynamicDataSource">       <property name="targetDataSources">           <map key-type="java.lang.String">             <!-- 指定lookupKey和与之对应的数据源 -->             <entry key="dataSource" value-ref="dataSource1"></entry>               <entry key="dataSource2" value-ref="dataSource2"></entry>             </map>       </property>       <!-- 这里可以指定默认的数据源 -->     <property name="defaultTargetDataSource" ref="dataSource1" />   </bean>  <!-- 数据源配置 -->    <bean id="dataSource1" class="com.alibaba.druid.pool.DruidDataSource"         init-method="init" destroy-method="close">         <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass -->        <property name="driverClassName" value="${jdbc.driver}" />        <!-- 基本属性 url、user、password -->        <property name="url" value="${jdbc.url}" />        <property name="username" value="${jdbc.username}" />        <property name="password" value="${jdbc.password}" />    </bean><bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource"         init-method="init" destroy-method="close">         <property name="driverClassName" value="${jdbc.driver}" />        <property name="url" value="${jdbc.urll}" />        <property name="username" value="${jdbc.username}" />        <property name="password" value="${jdbc.password}" />    </bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">        <property name="dataSource" ref="dynamicDataSource"/>        <property name="typeAliasesPackage" value="com.xx.xx"/>        <property name="typeAliasesSuperType"  value="com.xx.xx"/>        <property name="mapperLocations" value="classpath:/mappings/*.xml"/>        <property name="configLocation" value="classpath:/mybatis-config.xml"></property>    </bean>
 <!-- 定义事务 -->        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property name="dataSource" ref="dynamicDataSource" />    </bean>

3、

`public class DataSourceContextHolder {

  public static final String DATA_SOURCE_MYSQL = "dataSource1";  public static final String DATA_SOURCE_MSSQL = "dataSource2";  //设置当前线程使用dataSource  private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();  public static void setCustomerType(String customerType) {        contextHolder.set(customerType);  }  public static String getCustomerType() {      String dataSource = contextHolder.get();      if (StringUtils.isEmpty(dataSource)) {          return DATA_SOURCE_MYSQL;      }else {          return dataSource;      }  }  public static void clearCustomerType() {     contextHolder.remove();  }

}`

原创粉丝点击