SSM配置多数据源并可动态切换操作

SpringBoot2.1.5+Druid实现多数据源AOP动态切换 应用场景: 项目需要同时连接多个不同的数据库A, B,并且它们都需要读写操作 项目技术选项: SpringBoot_ssm 数据库:MySQL 、SQL server 看网上有很多类似笔记,但有些繁琐,这里简单说明,记个笔记。 以此记录: 依赖 这里仅仅展示部份关键依赖 <dependency> <groupId>org.mybati... 阅读详情

接到的需求是对本地数据库进行什么操作,就也要对服务器上的数据库进行同样的操作,本地是MySQL,服务器上是SQL server,公司服务器这两天没弄好,所以就先在本地对MySQL和SQL server进行测试。在组长刚告诉我这个需求的时候我觉得应该不算难,在把项目基本架构搭好调试好之后就开始着手做这个功能,但是仔细一想自己的思路是错的,从三层架构上来说应该是实现不了。于是就开始了面向百度编程的操作,在看了很多大同小异的技术博客以及让我的大佬同学帮我调试之后,于昨晚凌晨两点半终于可以正常使用了,但是只是一个Demo。在这里做一下笔记,以便以后复习。

项目结构

https://i-blog.csdnimg.cn/blog_migrate/239b7c7dc6a09bc0d15abc994fcd299e.png
java文件夹下的就不写了,测试代码而已,下面是对工具类以及配置文件中相对于只能跑通的时候所添加的东西的描述:

1.DataSourceHolder : 这是一个数据源持有类,可以定义get/set方法去查看/设置当前数据源,而且ThreadLocal也可以对两个数据源在多线程操作的时候提供线程保护,以便清楚的实现业务逻辑。

package com.tdhc.utils;


/**
 * 数据源持有类
 * @author yule
 * @date 2018/9/28 19:34
 */
public class DataSourceHolder {
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

    /**
     * @Description: 设置数据源类型
     * @param dataSourceType  数据库类型
     * @return void
     * @throws
     */
    public static void setDataSourceType(String dataSourceType) {
        contextHolder.set(dataSourceType);
    }

    /**
     * @Description: 获取数据源类型
     * @return String
     * @throws
     */
    public static String getDataSourceType() {
        return contextHolder.get();
    }

    /**
     * @Description: 清除数据源类型
     * @return void
     * @throws
     */
    public static void clearDataSourceType() {
        contextHolder.remove();
    }

}

2.RoutingDataSource : 这个是一个路由类,具体怎么实现的我也还没搞明白,不过在做的时候看到很多博客上都写了这个类,应该是对不同的数据源进行操作的时候有一个对不同数据库的分发操作机制吧。

package com.tdhc.utils;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
 * 路由类
 * @author yule
 * @date 2018/9/28 19:29
 */
public class RoutingDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceHolder.getDataSourceType();
    }
}

3.在jdbc.properties中配置两个数据源:(我配的是一个MySQL一个SQL server)

#============================#
#==== Database settings ====#
#============================#

# JDBC
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://localhost:3306/tdhc_quality?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
jdbc.username=root
jdbc.password=1234

jdbc.servet.driverClass=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc.servet.connectionURL=jdbc:sqlserver://localhost:2325;databaseName=AAA
jdbc.servet.username=sa
jdbc.servet.password=123456

# JDBC Pool
jdbc.pool.init=1
jdbc.pool.minIdle=3
jdbc.pool.maxActive=20



#============================#
#==== Framework settings ====#
#============================#

# \u89c6\u56fe\u6587\u4ef6\u5b58\u653e\u8def\u5f84
web.view.prefix=/WEB-INF/views/
web.view.suffix=.jsp

web.maxUploadSize=10485760

4.spring-context-druid.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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 加载配置属性文件 -->
    <context:property-placeholder ignore-unresolvable="true" location="classpath:jdbc_MySQL.properties"/>

    <!--配置数据源路由-->
    <bean id="dataSource" class="com.tdhc.utils.RoutingDataSource">
        <!-- 为targetDataSources注入两个数据源 -->
        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <entry key="db1" value-ref="firstDataSource"/>
                <entry key="db2" value-ref="secondDataSource"/>
            </map>
        </property>
        <!-- 为指定数据源RoutingDataSource注入默认的数据源-->
        <property name="defaultTargetDataSource" ref="firstDataSource"/>
    </bean>




    <!-- 需要 commons.dbcp 包 -->
    <bean id="firstDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClass}"/>
        <property name="url" value="${jdbc.connectionURL}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxIdle" value="20"/>
        <property name="defaultAutoCommit" value="true"/>
        <property name="removeAbandonedTimeout" value="60"/>
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="true"/>
        <property name="testWhileIdle" value="true"/>
    </bean>

    <!--数据源二-->
    <bean id="secondDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.servet.driverClass}"/>
        <property name="url" value="${jdbc.servet.connectionURL}"/>
        <property name="username" value="${jdbc.servet.username}"/>
        <property name="password" value="${jdbc.servet.password}"/>
        <property name="maxIdle" value="20"/>
        <property name="defaultAutoCommit" value="true"/>
        <property name="removeAbandonedTimeout" value="60"/>
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="true"/>
        <property name="testWhileIdle" value="true"/>
    </bean>


</beans>

5.spring-context-mybatis.xml : 在这个文件里面配置了sqlsessionFactory,对双数据源操作主要就是以创建两个connect实现的,所以sqlsessionFactory一定要配置好,里面包含了对实体类的扫描以及mapper文件的位置和有关创建sqlsessionFactory的配置文件的位置,还有就是mapper.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 配置 SqlSession -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 用于配置对应实体类所在的包,多个 package 之间可以用 ',' 号分割 -->
        <property name="typeAliasesPackage" value="com.tdhc.domain"/>
        <!-- 用于配置对象关系映射配置文件所在目录 -->
        <property name="mapperLocations" value="classpath*:/mapper/**/*.xml"/>
        <property name="configLocation" value="classpath:/mybatis-config.xml"/>
    </bean>

    <!-- 扫描 Mapper -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.tdhc.mapper" />
    </bean>
</beans>

6.spring-mvc.xml : 这个文件没有改动,因为这个文件并没有关于数据源操作的配置,主要是对bean的实例化,以及资源映射器,视图解析器,还有编码过滤器等的配置,这里放出来做个记录吧。

<?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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <description>Spring MVC Configuration</description>

    <!-- 加载配置属性文件  xml配置文件中需要的属性参数都可以放在其中 -->
    <context:property-placeholder ignore-unresolvable="true" location="classpath:*.properties"/>

    <!-- 使用 Annotation 自动注册 Bean,只扫描 @Controller 从base-package下开始扫描, 如果controller写到其他地方 需要另配。 -->
    <context:component-scan base-package="com.tdhc.controller" use-default-filters="false">
        <!-- 这里只能扫描到Controller  -->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 定义视图文件解析 -->
    <!-- controller 返回 index.jsp 之类的时候要用。 告诉文件的具体位置 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="${web.view.prefix}"/>
        <property name="suffix" value="${web.view.suffix}"/>
    </bean>

    <!-- 静态资源映射 -->
    <mvc:resources mapping="/static/**" location="/static/" cache-period="31536000"/>

    <!-- 处理请求返回json字符串的中文乱码问题 -->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
</beans>

总结一下:
1.对多数据源的配置要在jdbc.properties中配置两个数据库的连接信息
2.在其他配置文件中对数据源驱动包配置的时候进行读取,并且命名,并配置数据库路由,通过命名对其引用,并设置默认数据源。
3.在别的配置文件中有对这些配置的引用的话一定要保持一致
4.要注意的问题是数据源驱动包与tomcat版本的问题,另外就是项目依赖要规范,防止出现依赖冲突。

如果有不对的地方欢迎评论指正,感谢。

SSM 最灵活实现动态切换操作多数据源 面试难免让人焦虑不安。经历过的人都懂的。但是如果你提前预测面试官要问你的问题并想出得体的回答方式,就会容易很多。此外,都说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷!给我刷刷刷刷,使劲儿刷刷刷刷刷!今天既是来谈面试的,那就必须得来整点面试真题,这不花了我整28天,做了份“Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法等” 阅读详情

相关推荐

MyBatis 配置多数据源实现多个数据库动态切换 V2.0

原来写过一篇关于SSM多数据源配置的博客,为什么今天又要写一篇呢?当然是因为需求的变更(蹭访问量),原来的博客中,多个数据源是配置在xml文件中的,每一个数据源都对应了一个会话管理器dataSource,这样就把数据源的数量给订死了,你有几个会话管理器就有几个数据源,不太方便,所以这次想达到一个动态添加删除数据源的效果. 原来的博文请见https://blog.youkuaiyun.com/qq_37612755/article/details/82908700写的反正也不咋地 1.创建存放数据源信息的实体类 ..

孙应路的博客 1446

SSM 最简单的实现操作 多数据源&动态切换

在项目开发里面,多数据源是最普遍不过的,一个项目使用多个数据库是非常正常的,那么这篇就是基于SSM框架去轻松实现使用多数据源的实战场景。 基于SSM框架(还不了解SSM的的可以参考:https://blog.youkuaiyun.com/qq_35387940/article/details/97911104) 开始, 首先准备2个不同的数据源(多个也行),在jdbc.properties: #数...

默默不代表沉默 2522

Springboot 多数据源动态切换 以AOP切点方式实现

之前写了两篇操作多数据源的,不过是基于SSM框架的 (SSM最简单的操作多数据源: https://blog.youkuaiyun.com/qq_35387940/article/details/99324108) (SSM最灵活的操作多数据源:https://blog.youkuaiyun.com/qq_35387940/article/details/99713246) 那么现在这篇是Springboot操作多数据源...

默默不代表沉默 4888

@transaction导致切换数据源失效

记录工作时的一个大坑 之前遇到一个问题 排查了很久 有一个同事在service上加了一个@Transaction注解 然后在druid配置的多数据源。 在单个service中使用就没有问题,会自动转换数据源。 但是问题来了 在一个加了@Transaction的方法中 导致调用其他不同库的service 数据源切换失效。 列如: @Transaction @Service public class ServiceA{ //ServiceA,B,C 对应3个不同的数据源,单独调用方法没有问题 @Aut

weixin_46633487的博客 2400

基于SSM框架的多数据源配置实战

SSM(Spring + Spring MVC + MyBatis)是当前Java Web开发中最主流的轻量级框架组合。Spring作为核心容器,通过IoC(控制反转)管理对象生命周期与依赖关系,通过AOP(面向切面编程)实现日志、事务等横切关注点的解耦;Spring MVC则负责Web层的请求调度,具备灵活的控制器、视图解析和数据绑定机制;MyBatis作为持久层框架,采用ORM(对象关系映射)方式,将Java对象与数据库记录进行映射,简化数据库操作。

weixin_35972981的博客 952

ssm实现多数据源配置

ssm实现多数据源配置ssm实现多数据源配置ssm实现多数据源配置ssm实现多数据源配置,

项目要实现多数据源动态切换,咋搞?

文章首发于公众号:编程大道 在做项目的时候,几乎都会用到数据库,很多时候就只连一个数据库,但是有时候我们需要一个项目操作多个数据库,不同的业务功能产生的数据存到不同的数据库,那怎么来实现数据源的动态、灵活的切换呢?今天我们就来实现这个功能。 前期准备工作 我们需要有一台联网的电脑(用于maven自动下载依赖),并且电脑安装JDK 8、IDEA、MySQL数据库、maven,首先创建一个springboot项目(SSM也行)。springboot版本和SSM版本的代码都已经放到码云托管。感兴趣的可.

ibigboy 1222

STM32CUBEMX+STM32H750VB+LWIP+LAN8720A+FREERTOS TCP服务器、UDP数据接收发送、网线热插拔、IAR-8.32开发

STM32CUBEMX+STM32H750VB+LWIP+LAN8720A+FREERTOS TCP服务器、UDP数据接收发送、网线热插拔、IAR-8.32开发STM32H750VB使用STM32CUBEMX生成工程IAR+J-LINK调试准备工作CUBEMX生成的代码问题所在如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章U

qq_37433166的博客 5344

SSM框架配置多数据源连接不同的数据库

废话少说  直接上代码 1.创建数据源切换的class类   package com.util; public class DataSourceContextHolder { private static final ThreadLocal contextHolder = new ThreadLocal(); public static void se

taosuzhan的博客 2304

如何用 OBProxy 实现 OceanBase 的最佳路由策略

本文基于业务中一类常见的路由问题展开,对OceanBase的路由功能及对应配置项做详细介绍,指导用户在业务实践中如何正确的配置路由策略及快速排查路由问题

OceanBase分布式数据库的博客 1679

计算机补码两位乘法移位补0还是1,补码两位乘.doc

补码两位乘沈阳航空航天大学课 程 设 计 报 告课程设计名称:计算机组成原理课程设计课程设计题目:COP2000实现补码两位乘法院(系):计算机学院专 业:计算机科学与技术(嵌入式系统方向)班 级学 号:2009040101181姓 名:张驰指导教师:杨华完成日期:2012年1月14日目 录第1章 总体设计方案11.1设计原理11.2设计思路11.3设计环境2第2章...

weixin_34471838的博客 967

Spring项目中使用两种方法动态切换数据源,多数据源切换

本文介绍两种切换数据库的方法。 方法1:数据库信息都配置在spring xml中,适用于一般数据库切换。执行完某操作,切换数据库,执行另一个操作。 方法2:将数据库信息配置在默认数据源中,适用于切换数据库操作同一方法,相当于批量执行方法。...

u013034378的博客 5万+

展锐 Android 15 无听筒方案删除配置

【代码】展锐 Android 15 无听筒方案删除配置。

m0_60898338的博客 165

Spring MyBatis多数据源(同包)

创建基本的包 entity service dao 为了区分多数据源 一个用的是Mysql 一个是Oracle 方便测试, 创建MyBatis dao 映射 xml 文件 创建db.properties 我这里设置了2个数据源 创建Mybatis.xml 文件 建议创建2个,也...

試毅-思伟_技术博客 657

数学工具箱:Clarke与Park变换

本文详细解析了FOC(磁场定向控制)中的核心数学工具——Clarke变换与Park变换。首先阐述了坐标变换的必要性:将复杂的三相交流系统简化为直流系统,便于精确控制。Clarke变换将三相静止坐标系转换为两相静止坐标系,减少变量数量;Park变换进一步将两相静止坐标系转换为两相旋转坐标系,实现交流量到直流量的转换。文章提供了两种变换的数学公式、物理意义图解及C语言实现代码,并简要介绍了逆变换过程。这些变换为电机控制提供了关键的数学基础,后续将结合GD32F303的FPU特性进行优化实现。

汽车电子软件领域知识分享 177

[系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向

娜璋AI安全之家于2020年8月18日开通,将专注于Python和安全技术,主要分享Web渗透、系统安全、CVE复现、威胁情报分析、人工智能、大数据分析、恶意代码检测等文章。真心想把自己近十年的所学所做所感分享出来,与大家一起进步。 系统安全系列作者将深入研究恶意样本分析、逆向分析、攻防实战等,通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步。第一篇文章先带领大家学习什么是逆向分析,然后详细讲解逆向分析的典型应用,接着通过OllyDbg工具逆向分析经典的游戏扫雷,再通过Cheat Engin

杨秀璋的专栏 2万+

SSM多数据源注解动态切换

最新搭建的博客:http://www.cnstudio.top/ 创建项目就跳过了,自行百度创建SSM项目及一般的配置。 此文章前提是SSM基本配置已经完成,可以连接单数源。 有两种方法,但大致一样,第一种是第一次找到的,但只能在controller层注解,从代码分工来讲,controller不应该处理数据方面的问题,所以第一种方法不推荐,第二种是在service层注解,推荐使用。 方法1...

XGamer 3499

V90伺服 EPOS模式下回原(详细配置+SCL源代码)

/ 输出上限 100.0%rSetPoint : Real;// 设置目标值工程量。// 通道转换参考值。Td : Real;

RXXW_Dor的博客 2663

swagger-codegen 生成模型 Category:从 OpenAPI 定义到 Java 客户端代码的完整映射

[Category.md](https://link.gitcode.com/i/a0533d0a44cf90f655e51c5a7db3c7e7) 是 swagger-codegen 为 jersey2-java8 客户端示例自动生成的一篇模型文档,它记录了 OpenAPI 规范中 `Category` 数据模型的两个属性及其类型。本文以这份文档为线索,结合仓库中的 OpenAPI 定义([pe

gitblog_00437的博客 511

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

SSM 最简单的实现操作 多数据源&动态切换,rabbitmq与kafka面试

</mvc:message-converters> </mvc:annotation-driven> 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》 【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享 application/json;charset=UTF-8 classpath*:jdbc.properties <bean...

m0_65322636的博客 735

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SSM 多数据源配置(配置两个数据源)

SSM多数据源配置(配置两个数据源) 前言:SSM项目需要配置多数据源,以达到操作不同数据库的数据,网上看到大多是通过动态切换数据源的方式,但在项目中总会出现问题,这里通过配置两个spring-mybatis.xml(sqlSessionFactory,transactionManager),可以避免数据源切换问题。 具体思路如下: 1.ssm框架搭建略,系统项目结构如下: 注意点:两个数据源需要...

8770

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java Spring实现多数据源的动态切换

在实际的项目开发过程中我们经常会遇到一个项目需要使用多个数据源的情况,而多数据源又可分为固定多数据源和动态多数据源两种情况。     固定多数据源是指在项目中需要使用多个数据源,但数据源的个数是确定的,不会改变,如我们的项目需要使用订单库和商品库这两个数据源,项目中所有的业务逻辑都只需要操作这两个库。动态多数据源是指在项目需要使用多数据源,但是数据源的个数不确定,可能会随着项目的需要动态的新增或...

buyinuan的专栏 482
上一篇: jdbc.properties中常用数据库的连接配置
下一篇: 实体类实现序列化接口,定义private static final long serialVersionUID = 1L的含义
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值