spring集成mybatis多数据源的解决办法

今天尝试了单独把日志分库管理,这样在一个项目中使用了两个数据源,通过在网上搜罗资料,最终成功了,记录一下。

首先配置jdbc.properties(以下全部为基本配置)

db.driverClass=com.mysql.jdbc.Driver
db1.url=jdbc:mysql://localhost:3306/auge_new?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
db2.url=jdbc:mysql://localhost:3306/auge_log?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
db.username=root
db.password=123456

然后配置datasource-config.xml(可以直接在spring-mybatis.xml中配置,在这里我摘取出来了)

<!-- 数据库配置文件位置 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 数据源1-->
    <bean id="dataSource1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 基本属性 url、user、password -->
        <property name="driverClassName" value="${db.driverClass}"/>
        <property name="url" value="${db1.url}"/>
        <property name="username" value="${db.username}"/>
        <property name="password" value="${db.password}"/>
    </bean>
    <!-- 数据源2 -->
    <bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 基本属性 url、user、password -->
        <property name="driverClassName" value="${db.driverClass}"/>
        <property name="url" value="${db2.url}"/>
        <property name="username" value="${db.username}"/>
        <property name="password" value="${db.password}"/>
    </bean>
    <bean id="dynamicDataSource" class="com.xiaodou.park.interceptors.DynamicDataSource">
        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <!--指定lookupKey和与之对应的数据源 -->
                <entry key="dataSource1" value-ref="dataSource1"></entry>
                <entry key="dataSource2" value-ref="dataSource2"></entry>
            </map>
        </property>
        <!--这里可以指定默认的数据源-->
        <property name="defaultTargetDataSource" ref="dataSource1"/>
    </bean>

下面为DynamicDataSource类和DynamicDataSourceHolder类。

public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        // 从自定义的位置获取数据源标识
        return DynamicDataSourceHolder.getDataSource();
    }
}
public class DynamicDataSourceHolder {
    private static final ThreadLocal <String> THREAD_DATA_SOURCE = new ThreadLocal <String>();
    public static String getDataSource(){
        return THREAD_DATA_SOURCE.get();
    }
    public static void setDataSource(String dataSource){
        THREAD_DATA_SOURCE.set(dataSource);
    }
    public static void clearDataSource(){
        THREAD_DATA_SOURCE.remove();
    }
}

然后在spring-mybatis.xml中配置工厂类和事物处理。

    <import resource="datasource-config.xml" />

    <!-- 数据源 会话工厂 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:mybatis-config.xml" />
        <property name="dataSource" ref="dynamicDataSource" />
    </bean>


    <!-- 数据源 映射 -->
    <!--<context:component-scan base-package="com.wechat.xiaodou.mapper"/>-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        <!--可用,或者;分割多个扫描的包-->
        <property name="basePackage" value="com.xiaodou.park.mapper"/>
    </bean>

    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource">
            <ref bean="dynamicDataSource"/>
        </property>
    </bean>

配置好之后,默认使用dataSource1数据源,若想使用dataSource2数据源,如下代码所示:

DynamicDataSourceHolder.setDataSource("dataSource2");
errorLogService.insertSelective(errorLog);
暂时就这样了,后续代码开发后再记录。

猜你喜欢

转载自blog.csdn.net/qq_23543983/article/details/80080733
今日推荐