SSM整合多数据源

Spring+SpringMVC+MyBaits 整合多数据源。数据库:MySQL+Mariadb。
SSM基本配置这里就不细说了,直接进入正题,进行多数据源的配置。

附源码地址:https://gitee.com/hiseico/mybatis-multi-source-isomerism

我的博客:https://blog.sitcat.cn/

引入Mysql及Maria数据库驱动包,以Maven为例

 <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.36</version>
  </dependency>
  
  <dependency>
     <groupId>org.mariadb.jdbc</groupId>
     <artifactId>mariadb-java-client</artifactId>
     <version>2.4.1</version>
   </dependency>

具体版本自己定。

jdbc.properties中配置多个数据源

jdbc.mysql.driver=com.mysql.jdbc.Driver
jdbc.mysql.url=jdbc:mysql://localhost:3306/clouddb01?useUnicode=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
jdbc.mysql.username=root
jdbc.mysql.password=root

jdbc.mariadb.driver=org.mariadb.jdbc.Driver
jdbc.mariadb.url=jdbc:mariadb://localhost:3307/clouddb02?useUnicode=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
jdbc.mariadb.username=root
jdbc.mariadb.password=root

在Spring的application.xml中为每一个数据库配置数据源、MyBatis相关、事务等

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

    <!-- 自动扫描 -->
    <context:component-scan base-package="cn.sitcat.service"/>

    <!-- 引入配置文件 -->
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:jdbc.properties</value>
            </list>
        </property>
    </bean>

    <!--第一步: 配置数据源 -->
    <!--mysql数据库 数据源-->
    <bean id="mysqlDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

        <property name="driverClassName" value="${jdbc.mysql.driver}"/>
        <property name="url" value="${jdbc.mysql.url}"/>
        <property name="username" value="${jdbc.mysql.username}"/>
        <property name="password" value="${jdbc.mysql.password}"/>
    </bean>
    <!--Maria数据库 数据源-->
    <bean id="MariaDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.mariadb.driver}"/>
        <property name="url" value="${jdbc.mariadb.url}"/>
        <property name="username" value="${jdbc.mariadb.username}"/>
        <property name="password" value="${jdbc.mariadb.password}"/>
    </bean>

    <!-- Mybatis SqlSessionFactory -->
    <!--mysql数据库 Mybatis SqlSessionFactory-->
    <bean id="sqlSessionFactory01" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="mysqlDataSource"/>
    </bean>
    <!--Maria数据库 Mybatis SqlSessionFactory-->
    <bean id="MariaSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="MariaDataSource"/>
    </bean>

    <!-- 配置mybatis的代理接口开发 * 接口类名和映射文件必须同名 * 接口类和映射文件必须在同一个目 录下 * 接口的映射文件的namespace名称必须是接口的全限定名
      * 接口的方法名必须和映射的statement的id一致 -->
    <!--mysql数据库 mapperScanner-->
    <bean id="MysqlMapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="cn.sitcat.dao.mysql"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory01"/>
    </bean>
    <!--Maria数据库 mapperScanner-->
    <bean id="MariaMapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="cn.sitcat.dao.maria"/>
        <property name="sqlSessionFactoryBeanName" value="MariaSqlSessionFactory"/>
    </bean>

    <!-- 事务管理 -->
    <tx:annotation-driven transaction-manager="MysqlTransactionManager"/>
    <tx:annotation-driven transaction-manager="MariaTransactionManager"/>

    <!--mysql数据库-->
    <bean id="MysqlTransactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="mysqlDataSource"/>
        <qualifier value="mysqlDataSourceTx"/>
    </bean>
    <!--Maria数据库-->
    <bean id="MariaTransactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="mysqlDataSource"/>
        <qualifier value="MariaDataSourceTx"/>
    </bean>

    <!-- 配置事物增强,事物如何切入 -->
    <!--Mysql数据库的事务-->
    <tx:advice id="MysqlTxAdvice" transaction-manager="MysqlTransactionManager">
        <tx:attributes>
            <!-- 传播行为 -->
            <tx:method name="*" propagation="SUPPORTS"/>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="create*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="batchUpdate*" propagation="REQUIRED"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
    </tx:advice>

    <!--Maria数据库的事务-->
    <tx:advice id="MariaTxAdvice" transaction-manager="MariaTransactionManager">
        <tx:attributes>
            <!-- 传播行为 -->
            <tx:method name="*" propagation="SUPPORTS"/>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="create*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="batchUpdate*" propagation="REQUIRED"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
    </tx:advice>
</beans>

剩下的Mapper.xml、Serivce层等业务和单数据源的时候一样,直接编写对应表的Mapper即可。

注意事项

1.这里不推荐在application.xml中使用databaseIdProvider配置。如下:

<!-- 多数据库处理,设定vendor属性 -->
   <bean id="vendorProperties"
         class="org.springframework.beans.factory.config.PropertiesFactoryBean">
       <property name="properties">
           <props>
               <prop key="Oracle">oracle</prop> <!-- 配置数据库关键字,可在mapper的xml中使用 -->
               <prop key="MySQL">mysql</prop>
               <prop key="SQL Server">sqlserver</prop>
               <prop key="DB2">db2</prop>
           </props>
       </property>
   </bean>
   <bean id="databaseIdProvider" class="org.apache.ibatis.mapping.VendorDatabaseIdProvider">
       <property name="properties" ref="vendorProperties" />
   </bean>

这样配置的话,在mapper.xml中的语句上使用databaseId声明数据源会直接报错。

    <select id="selectUserList" databaseId="Mysql" resultType="cn.sitcat.entity.maria.User">
        SELECT * FROM user
    </select>

会报错invalid bound statement (not found),具体原因还未查明。(可能是我的配置不对)


2.每个数据库的mapper放到单独的一个包下,不要将多个数据库的mapper挡在同一个目录里。在Spring的配置文件application.xml中的MapperScannerConfigurer分别声明对应的basePackage。如下:

    <!--mysql数据库 mapperScanner-->
    <bean id="MysqlMapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="cn.sitcat.dao.mysql"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory01"/>
    </bean>
    <!--Maria数据库 mapperScanner-->
    <bean id="MariaMapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="cn.sitcat.dao.maria"/>
        <property name="sqlSessionFactoryBeanName" value="MariaSqlSessionFactory"/>
    </bean>

附:项目结构图

项目结构
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269