天天看点

SpringBoot分表分库配置多数据源

1、背景的介绍

有时候我们需要做分库分表,那么肯定存在多数据源,Spring Boot和Mybatis的多数据源是如何整合的呢?比如说我们现在做了一个浪迹天涯管理的后台系统,商品信息是存在itemCenter数据源中的,而与用户相关的信息是存在account数据源中,项目结构如下:

SpringBoot分表分库配置多数据源

2、Spring Boot和Mybatis的整合

2.1 添加相关的pom文件

这个我不在这里详细的贴代码,稍后请查看具体的源代码。

2.2 在环境配置文件中添加数据库的配置

SpringBoot分表分库配置多数据源

因为我们这里有四个环境,分别是dev、sit、ust、prod。所以我们需要在每个环境下配置jdbc.properties。并且我们在jdbc.properties配置文件中配置了2个数据源,分别是itemcenter和account。

2.3 数据源的读取和事物的配置以及Mybatis的配置

因为这些都是通用的,所以我们放在了common这个文件下统一配置了,如下图所示:

SpringBoot分表分库配置多数据源

(1). 现在我们具体的看下dataSource.xml的配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:tx="http://www.springframework.org/schema/tx"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

<aop:aspectj-autoproxy proxy-target-class="false"/>

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

<tx:annotation-driven transaction-manager="txManager" />

<bean id="itemcenterDataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
    <property name="url" value="${itemcenter.jdbc.url}" />
    <property name="username" value="${itemcenter.jdbc.username}" />
    <property name="password" value="${itemcenter.jdbc.password}" />
    <property name="driverClassName" value="${itemcenter.jdbc.driver}" />
</bean>

<bean id="accountDataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
    <property name="url" value="${account.jdbc.url}" />
    <property name="username" value="${account.jdbc.username}" />
    <property name="password" value="${account.jdbc.password}" />
    <property name="driverClassName" value="${account.jdbc.driver}" />
</bean>

<bean id ="dataSource" class= "com.niepengfei.langjitianya.config.DynamicDataSource" >
    <property name ="targetDataSources">
        <map key-type ="java.lang.String">
            <entry value-ref ="itemcenterDataSource" key= "itemcenter_dataSource"/>
            <entry value-ref ="accountDataSource" key= "account_dataSource"/>
        </map>
    </property>
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="configLocation" value="classpath:config/common/mybatisConfig.xml"/>
    <property name="dataSource" ref="dataSource"/>
</bean>
</beans>
           

(2). 现在我们具体的看下mybatisConfig.xml的配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

        <!-- 配置分页插件 -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->        
            <property name="dialect" value="mysql"/>
        </plugin>
    </plugins>

</configuration>
           

dataSource.xml是读取数据源,且mybatisConfig.xml是在dataSource.xml被加载。

2.4 开发dao

我们把dao和相应的xml文件放在一起,约定俗成。这样省去了配置dao和xml的对应关系。

SpringBoot分表分库配置多数据源

2.5 启动类的配置

SpringBoot分表分库配置多数据源

2.6 我们的数据源的切换是在service层,这里我使用Spring AOP的思想,利用切面在Service层切换数据源。

(1).首先定义数据源的枚举

SpringBoot分表分库配置多数据源

(2)、然后分别为每个数据源定义个注解,例如AccountDatasource和ItemCenterDataSource,代码如下:

SpringBoot分表分库配置多数据源

(3).定义DynamicDataSource,该类继承AbstractRoutingDataSource,重写determineCurrentLookupKey:

SpringBoot分表分库配置多数据源

(4)、定义数据源切面:

SpringBoot分表分库配置多数据源

(5)、在Service层加上相应的数据源注解

SpringBoot分表分库配置多数据源

以上就是全部过程。