天天看點

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分表分庫配置多資料源

以上就是全部過程。