在项目中实现多数据源和读写分离的配置

本文介绍了两种在Java项目中实现多数据源和读写分离的配置方法。第一种方法涉及在Mybatis配置文件中配置多个数据源,通过不同的Mapper目录和Bean名称区分,并在Service层指定数据源。第二种方法利用线程保存数据库Key值,动态决定数据源,并在Mybatis中配置Bean,根据需要切换数据源。

一:第一种

 

1:在mybatis配置文件当中配置多个数据源

<context:component-scan base-package="com.zjl.ssm"><!-- base-package 如果多个,用“,”分隔 -->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/><!-- 过滤其中这四个注解中的一个 -->
    </context:component-scan>

    <!-- 引入数据库配置文件 -->
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
        <property name="location" value="classpath:properties/jdbc.properties"/>
    </bean>

    <!--
    3307数据库==============================================================
    -->
    
    <!-- 配置数据库 -->
		<bean id="dataSource3307" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
            <property name="driverClassName" value="${jdbc.driver3307}"/>
            <property name="url" value="${jdbc.url3307}"/>
            <property name="username" value="${jdbc.username3307}"/>
            <property name="password" value="${jdbc.password3307}"/>
		</bean>
    
    <!-- 配置 MyBatis SqlSessionFactory -->
    <bean id="sqlSessionFactory3307" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
        <!-- 指定 MyBatis 数据源 -->
        <property name="dataSource" ref="dataSource3307"/>
        <!-- 指定 MyBatis mapper 映射文件位置 -->
        <property name="mapperLocations" value="classpath:com/zjl/ssm/dao/db3307/mapper/*.xml"/>
        <!-- 指定 MyBatis 全局配置文件的位置 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="plugins">
            <array>
                <!-- 分页插件配置 -->
                <bean id="paginationInterceptor" class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
                    <property name="dialectType" value="mysql"/>
                </bean>
            </array>
        </property>
        <property name="globalConfig" ref="globalConfig" />
    </bean>

    <!-- 扫描 MyBatis 的 dao 接口 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--扫描所有 dao 接口,加入到 IOC 容器中 -->
        <property name="basePackage" value="com.zjl.ssm.dao.db3307"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory3307"/>
    </bean>

    <!-- 定义事务 -->
    <bean id="transactionManager3307"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource3307"/>
    </bean>

    <!-- 使用注解定义事务 -->
    <tx:annotation-driven transaction-manager="transactionManager3307"/>

    <!--
   3308数据库==============================================================
   -->

    <!-- 配置数据库 -->
    <bean id="dataSource3308" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver3308}"/>
        <property name="url" value="${jdbc.url3308}"/>
        <property name="username" value="${jdbc.username3308}"/>
        <property name="password" value="${jdbc.password3308}"/>
    </bean>

    <!-- 配置 MyBatis SqlSessionFactory -->
    <bean id="sqlSessionFactory3308" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
        <!-- 指定 MyBatis 数据源 -->
        <property name="dataSource" ref="dataSource3308"/>
        <!-- 指定 MyBatis mapper 映射文件位置 -->
        <property name="mapperLocations" value="classpath:com/zjl/ssm/dao/db3308/mapper/*.xml"/>
        <!-- 指定 MyBatis 全局配置文件的位置 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="plugins">
            <array>
                <!-- 分页插件配置 -->
                <bean id="paginationInterceptor" class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
                    <property name="dialectType" value="mysql"/>
                </bean>
            </array>
        </property>
        <property name="globalConfig" ref="globalConfig" />
    </bean>

    <!-- 扫描 MyBatis 的 dao 接口 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--扫描所有 dao 接口,加入到 IOC 容器中 -->
        <property name="basePackage" value="com.zjl.ssm.dao.db3308"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory3308"/>
    </bean>

    <!-- 定义事务 -->
    <bean id="transactionManage3308"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource3308"/>
    </bean>

    <!-- 使用注解定义事务 -->
    <tx:annotation-driven transaction-manager="transactionManage3308"/>

    <!--
   3309数据库==============================================================
   -->

    <!-- 配置数据库 -->
    <bean id="dataSource3309" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver3309}"/>
        <property name="url" value="${jdbc.url3309}"/>
        <property name="username" value="${jdbc.username3309}"/>
        <property name="password" value="${jdbc.password3309}"/>
    </bean>

    <!-- 配置 MyBatis SqlSessionFactory -->
    <bean id="sqlSessionFactory3309" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
        <!-- 指定 MyBatis 数据源 -->
        <property name="dataSource" ref="dataSource3309"/>
        <!-- 指定 MyBatis mapper 映射文件位置 -->
        <property name="mapperLocations" value="classpath:com/zjl/ssm/dao/db3309/mapper/*.xml"/>
        <!-- 指定 MyBatis 全局配置文件的位置 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="plugins">
            <array>
                <!-- 分页插件配置 -->
                <bean id="paginationInterceptor" class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
                    <property name="dialectType" value="mysql"/>
                </bean>
            </array>
        </property>
        <property name="globalConfig" ref="globalConfig" />
    </bean>

    <!-- 扫描 MyBatis 的 dao 接口 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--扫描所有 dao 接口,加入到 IOC 容器中 -->
        <property name="basePackage" value="com.zjl.ssm.dao.db3309"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory3309"/>
    </bean>

    <!-- 定义事务 -->
    <bean id="transactionManager3309"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource3309"/>
    </bean>

    <!-- 使用注解定义事务 -->
    <tx:annotation-driven transaction-manager="transactionManager3309"/>

    <!--
   3310数据库==============================================================
   -->

    <!-- 配置数据库 -->
    <bean id="dataSource3310" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver3310}"/>
        <property name="url" value="${jdbc.url3310}"/>
        <property name="username" value="${jdbc.username3310}"/>
        <property name="password" value="${jdbc.password3310}"/>
    </bean>

    <!-- 配置 MyBatis SqlSessionFactory -->
    <bean id="sqlSessionFactory3310" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
        <!-- 指定 MyBatis 数据源 -->
        <property name="dataSource" ref="dataSource3310"/>
        <!-- 指定 MyBatis mapper 映射文件位置 -->
        <property name="mapperLocations" value="classpath:com/zjl/ssm/dao/db3310/mapper/*.xml"/>
        <!-- 指定 MyBatis 全局配置文件的位置 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="plugins">
            <array>
                <!-- 分页插件配置 -->
                <bean id="paginationInterceptor" class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
                    <property name="dialectType" value="mysql"/>
                </bean>
            </array>
        </property>
        <property name="globalConfig" ref="globalConfig" />
    </bean>

    <!-- 扫描 MyBatis 的 dao 接口 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--扫描所有 dao 接口,加入到 IOC 容器中 -->
        <property name="basePackage" value="com.zjl.ssm.dao.db3310"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory3310"/>
    </bean>

    <!-- 定义事务 -->
    <bean id="transactionManager3310"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource3310"/>
    </bean>

    <!-- 使用注解定义事务 -->
    <tx:annotation-driven transaction-manager="transactionManager3310"/>


    <!--
   ======================================================================
   -->

    <bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
        <!--
            AUTO->`0`("数据库ID自增")
             INPUT->`1`(用户输入ID")
            ID_WORKER->`2`("全局唯一ID")
            UUID->`3`("全局唯一ID")
        -->
        <property name="idType" value="2" />
        <!--
            MYSQL->`mysql`
            ORACLE->`oracle`
            DB2->`db2`
            H2->`h2`
            HSQL->`hsql`
            SQLITE->`sqlite`
            POSTGRE->`postgresql`
            SQLSERVER2005->`sqlserver2005`
            SQLSERVER->`sqlserver`
        -->
        <!-- Oracle需要添加该项 -->
        <!-- <property name="dbType" value="oracle" /> -->
        <!-- 全局表为下划线命名设置 true -->
        <property name="dbColumnUnderline" value="true" />
    </bean>

 

2:建立四个mapper目录,将不同数据库的调用分隔开

记得修改xml文件中的工作空间

 

3:将*mapper.java的Bean名称修改,以免相同的bean名称发生冲突

 

4:在service调用时指定bean名称和mapper全路径

 

5:调用,查询调用从库,增删改调用主库

 

二:第二种

1:创建线程,用来保存数据库的Key值

public class ThreadLocalHoder {

    public static ThreadLocal<String> holder = new ThreadLocal<>();

    public static String getDataSource(){
        return holder.get();
    }

    public static void setDataSourceKey(String dataSourceKey){
        holder.set(dataSourceKey);
    }

}

 

2:采用一个动态数据源,在程序运行时,决定采用那个数据源,并设置默认数据源

/**
 * 采用一个动态数据源,在程序运行时,决定采用那个数据源
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

    public static final String DB3307 = "db3307";
    public static final String DB3308 = "db3308";
    public static final String DB3309 = "db3309";
    public static final String DB3310 = "db3310";


    /**
     * 设置好数据源的key
     * @return
     */
    @Override
    protected Object determineCurrentLookupKey() {
        //设置默认数据源
        if(ThreadLocalHoder.getDataSource() == null){
            ThreadLocalHoder.setDataSourceKey(DB3309);
        }
        return ThreadLocalHoder.getDataSource();
    }


}

 

3:在mybatis中配置Bean

<context:component-scan base-package="com.zjl.ssm"><!-- base-package 如果多个,用“,”分隔 -->
        <context:exclude-filter type="annotation"
                                expression="org.springframework.stereotype.Controller"/><!-- 过滤其中这四个注解中的一个 -->
    </context:component-scan>

    <!-- 引入数据库配置文件 -->
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
        <property name="location" value="classpath:properties/jdbc.properties"/>
    </bean>

    <!--  3307数据库==============================================================  -->

    <!-- 配置数据库 -->
    <bean id="dataSource3307" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver3307}"/>
        <property name="url" value="${jdbc.url3307}"/>
        <property name="username" value="${jdbc.username3307}"/>
        <property name="password" value="${jdbc.password3307}"/>
    </bean>

    <!--  3308数据库==============================================================  -->

    <!-- 配置数据库 -->
    <bean id="dataSource3308" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver3308}"/>
        <property name="url" value="${jdbc.url3308}"/>
        <property name="username" value="${jdbc.username3308}"/>
        <property name="password" value="${jdbc.password3308}"/>
    </bean>

    <!--  3309数据库==============================================================  -->

    <!-- 配置数据库 -->
    <bean id="dataSource3309" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver3309}"/>
        <property name="url" value="${jdbc.url3309}"/>
        <property name="username" value="${jdbc.username3309}"/>
        <property name="password" value="${jdbc.password3309}"/>
    </bean>


    <!--  3310数据库==============================================================  -->

    <!-- 配置数据库 -->
    <bean id="dataSource3310" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver3310}"/>
        <property name="url" value="${jdbc.url3310}"/>
        <property name="username" value="${jdbc.username3310}"/>
        <property name="password" value="${jdbc.password3310}"/>
    </bean>


    <!--
   ======================================================================
   -->

    <bean id="dynamicDataSource" class="com.zjl.ssm.controller.common.jdbc.DynamicDataSource">
        <property name="targetDataSources">
            <map>
                <entry key="db3307" value-ref="dataSource3307"/>
                <entry key="db3308" value-ref="dataSource3308"/>
                <entry key="db3309" value-ref="dataSource3309"/>
                <entry key="db3310" value-ref="dataSource3310"/>
            </map>
        </property>
    </bean>



    <!-- 配置 MyBatis SqlSessionFactory -->
    <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
        <!-- 指定 MyBatis 数据源 -->
        <property name="dataSource" ref="dynamicDataSource"/>
        <!-- 指定 MyBatis mapper 映射文件位置 -->
        <property name="mapperLocations" value="classpath:com/zjl/ssm/dao/mapper/*.xml"/>
        <!-- 指定 MyBatis 全局配置文件的位置 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="plugins">
            <array>
                <!-- 分页插件配置 -->
                <bean id="paginationInterceptor" class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
                    <property name="dialectType" value="mysql"/>
                </bean>
            </array>
        </property>
        <property name="globalConfig" ref="globalConfig"/>
    </bean>

    <!-- 扫描 MyBatis 的 dao 接口 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--扫描所有 dao 接口,加入到 IOC 容器中 -->
        <property name="basePackage" value="com.zjl.ssm.dao"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

 

4:在进行CRUD时设置数据源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值