spring mybatis 多数据源配置

项目上遇到多数据源的问题,分别是阿里的DRDS和ADB数据库,他们的语法都是一样通用mysql语法。

不同点:DRDS有事务,,ADB无事务。

所以,数据源需要针对调用不同的接口来来进行切换。

整个处理过程,经历了比较坎坷的过程。

1.使用spring的切面+注解@DataSource来解决。

问题:在同一线程中抛出异常后,后续的异常处理方法,切换数据源失败。

2.使用注解+切面,在BO层进行处理。

问题:代码侵入性高,需要解决事务问题。

3.使用mybatis的多数据源,多MapperScan,多sqlSessionFactory配置。

虽然也有确定,但是这个不需要多个数据源在切面来控制,需要改的有两点:

A:   Mapper.xml所在的文件需要分开指定

B : Mapper.java所在包需要分开指定

具体配置如下:

1.数据源dataSource

 <bean id="ims-druidDataSource-drds" class="com.alibaba.druid.pool.DruidDataSource"
          init-method="init" destroy-method="close" primary="true">
        <!-- 基本属性 url、user、password -->
        <property name="url" value="${spring.datasource.drds.url}"/>
        <property name="username" value="${spring.datasource.drds.username}"/>
        <property name="password" value="${spring.datasource.drds.password}"/>
        <property name="driverClassName" value="${spring.datasource.driver-class-name}"/>
        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="5"/>
        <property name="minIdle" value="5"/>
        <property name="maxActive" value="100"/>
        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="60000"/>
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000"/>
        <property name="validationQuery" value="SELECT ‘x‘"/>
        <!--单位:秒,检测连接是否有效的超时时间,底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法-->
        <property name="validationQueryTimeout" value="30"/>
        <property name="testWhileIdle" value="true"/>
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="false"/>
        <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
        <property name="poolPreparedStatements" value="false"/>
        <property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>
        <property name="asyncInit" value="false"/>

    </bean>
   <bean id="ims-druidDataSource-adb" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close" primary="false">
       <property name="url" value="${spring.datasource.adb.url}"/>
       <property name="username" value="${spring.datasource.adb.username}"/>
       <property name="password" value="${spring.datasource.adb.password}"/>
       <property name="driverClassName" value="${spring.datasource.driver-class-name}"/>
       <property name="initialSize" value="1"/>
       <property name="minIdle" value="1"/>
       <property name="maxActive" value="20"/>
       <property name="maxWait" value="60000"/>
       <property name="timeBetweenEvictionRunsMillis" value="60000"/>
       <property name="minEvictableIdleTimeMillis" value="300000"/>
       <property name="validationQuery" value="SELECT ‘x‘"/>
       <property name="validationQueryTimeout" value="30"/>
       <property name="testWhileIdle" value="true"/>
       <property name="testOnBorrow" value="false"/>
       <property name="testOnReturn" value="false"/>
       <property name="poolPreparedStatements" value="false"/>
       <property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>
       <property name="asyncInit" value="false"/>
   </bean>

2.SqlSessionFactoryBean 配置

 <bean id="drdsSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="ims-druidDataSource-drds"/>
        <property name="configLocation" value="${mybatis.config-location}"/>
        <property name="typeAliasesPackage" value="cn.hsa.ims.*.entity"/>
        <property name="mapperLocations">
            <array>
                <value>classpath*:sql/mysql/**/*Mapper.xml</value>
            </array>
        </property>
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <value>
                            helperDialect=${pagehelper.helperDialect}
                        </value>
                    </property>
                </bean>
            </array>
        </property>
        <property name="databaseIdProvider" ref="databaseIdProvider"/>
    </bean>

    <bean id="adbSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="ims-druidDataSource-adb"/>
        <property name="configLocation" value="${mybatis.config-location}"/>
        <property name="typeAliasesPackage" value="cn.hsa.ims.*.entity"/>
        <property name="mapperLocations">
            <array>
                <value>classpath*:sql/adb/**/*Mapper.xml</value>
            </array>
        </property>
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <value>
                            helperDialect=${pagehelper.helperDialect}
                        </value>
                    </property>
                </bean>
            </array>
        </property>
        <property name="databaseIdProvider" ref="databaseIdProvider"/>
    </bean>
<!--配置一个databaseIdProvider sql如果有方言,自己增加databaseId属性-->
    <bean id="databaseIdProvider" class="org.apache.ibatis.mapping.VendorDatabaseIdProvider">
        <property name="properties">
            <props>
                <prop key="MySQL">mysql</prop>
                <prop key="Oracle">oracle</prop>
                <prop key="SQL Server">sqlserver</prop>
                <prop key="DB2">db2</prop>
            </props>
        </property>
    </bean>

3.对应的mapperScan配置

<bean id="drdsMapperScan" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="drdsSqlSessionFactory"/>
        <property name="basePackage" value="cn.hsa.ims.*.dao"/>
    </bean>

    <bean id="adbMapperScan" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="adbSqlSessionFactory"/>
        <property name="basePackage" value="cn.hsa.ims.*.adb.dao"/>
    </bean>

注意:

如果使用springboot,需要在启动的时候扫描的@MapperSacan去除。

原文地址:https://www.cnblogs.com/sloveling/p/mulit_datasource.html

时间: 2024-11-13 00:13:21

spring mybatis 多数据源配置的相关文章

IT忍者神龟之Spring+MyBatis多数据源配置实现

最近用到了MyBatis配置多数据源,原以为简单配置下就行了,实际操作后发现还是要费些事的,这里记录下,以作备忘 不多废话,直接上代码,后面会有简单的实现介绍 jdbc和log4j的配置 #定义输出格式 ConversionPattern=%d %-5p [%t] %c - %m%n log4j.rootLogger=DEBUG,Console log4j.logger.com.cnblogs.lzrabbit=DEBUG log4j.logger.org.springframework=ERR

springMVC+spring+mybatis多数据源配置

1.application.properties配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="htt

Spring+Mybatis多数据源配置

一.配置文件 properties ds1.driverClassName=com.mysql.jdbc.Driver ds1.url=jdbc:mysql://192.168.200.130:3306/test1?useUnicode=true&characterEncoding=UTF-8 ds1.username=hhh ds1.password=123456 ds2.driverClassName=oracle.jdbc.OracleDriver ds2.url=jdbc:mysql:/

Spring+MyBatis多数据源配置实现

る圣 盈这是上次你见过的郑连长和江排长县手 锤╇吩怀 啶呼毒憩 周先生就说你这个说法行吧但那瓷器上的火 郜童粑 咫瘟霓涸 び╆炉砺 褰肚熟 泛采噌 氙爬夸 诀挑袤 悔噙觏 \持镦韵 黉懊鞑谋 帔流馁 补侍芙 幛艮岽王 軎 腭嫖湓浚 羌夥蠊瘀 鹉茇咬 筏艄有 焖刁舒持 旎昀旄 胙悬少 缈蓁冗 适扮铠m 幌攸吗棣 那陈总皱了皱眉高明远的资料是没问题但他显然不可能会 才会这样做他们有什么把握绝对的把握是什么 饼诳楞 仟俜余 赢с瘰 翠伺瘛 ≠⒃走京 垣爨胼阏

Spring Boot 2.X(五):MyBatis 多数据源配置

前言 MyBatis 多数据源配置,最近在项目建设中,需要在原有系统上扩展一个新的业务模块,特意将数据库分库,以便减少复杂度.本文直接以简单的代码示例,如何对 MyBatis 多数据源配置. 准备 创建数据库 db_test SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for t_user -- -------------------------

spring,mybatis事务管理配置与@Transactional注解使用

spring,mybatis事务管理配置与@Transactional注解使用[转] 概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects) 支持声明式事务管理,特别是基

spring,mybatis事务管理配置与@Transactional注解使用[转]

spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence A

Spring+Mybatis+Maven 整合配置

1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans default-autowire="byName" 3 xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:sche

Spring+MyBatis双数据库配置

Spring+MyBatis双数据库配置 近期项目中遇到要调用其它数据库的情况.本来仅仅使用一个MySQL数据库.但随着项目内容越来越多,逻辑越来越复杂. 原来一个数据库已经不够用了,须要分库分表.所以决定扩充数据库,正好Spring能够灵活的扩充数据库.以下简单写一篇博文,记录下多数据库配置的过程. 1.项目结构例如以下图: 当中mkhl和ulab分别相应两个数据库模块.同一时候也相应两个不同的功能模块. 2.整个Maven项目的配置文件:pom.xml <project xmlns="