SpringBoot配置双数据源

springboot之多数据源配置 应用直接操作的是abstractRoutingDataSource的实现类,告诉AbstractRoutingDataSource访问哪个数据库,然后由AbstractRoutingDataSource从事先配置好的数据源 (ds1,ds2)选择哪一个 ,来访问对应的数据库。 阅读详情

达到效果:

使用注解方式即时切换数据源。

pom.xml部分

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.8.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

……

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot</artifactId>
			<version>2.0.6.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot</artifactId>
			<version>1.5.8.RELEASE</version>
		</dependency>

application.properties

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jackson.serialization.indent_output=true

#第一数据源
spring.datasource.primary.url=jdbc:oracle:thin:@192.168.1.41:1521:orcl
spring.datasource.primary.username=pmshtkq
spring.datasource.primary.password=pmshtkq
spring.datasource.primary.driver-class-name=oracle.jdbc.OracleDriver
#第二数据源
spring.datasource.secondary.url=jdbc:mysql://192.168.1.51:3306/qqgg?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver

创建类

package com.hontye.DataSource;

public class DataSourceContextHolder {
    /**
     * 默认数据源
     */
    public static final String DEFAULT_DS = "secondaryDataSource";

    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

    // 设置数据源名
    public static void setDB(String dbType) {
        contextHolder.set(dbType);
    }

    // 获取数据源名
    public static String getDB() {
        return (contextHolder.get());
    }

    // 清除数据源名
    public static void clearDB() {
        contextHolder.remove();
    }
}
package com.hontye.DataSource;

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

/**
 * @Author: ch
 * @Date: 2018/6/27 11:40
 * @Description:
 */
public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDB();
    }
}
package com.hontye.DataSource;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;

/**
 * @Author: ch
 * @Date: 2018/6/27 11:48
 * @Description:
 */
@Aspect
@Component
public class DynamicDataSourceAspect {

    @Before("@annotation(com.hontye.DataSource.DataSourceNote)")
    public void beforeSwitchDS(JoinPoint point){

        //获得当前访问的class
        Class<?> className = point.getTarget().getClass();

        //获得访问的方法名
        String methodName = point.getSignature().getName();
        //得到方法的参数的类型
        Class[] argClass = ((MethodSignature)point.getSignature()).getParameterTypes();
        String dataSource = DataSourceContextHolder.DEFAULT_DS;
        try {
            // 得到访问的方法对象
            Method method = className.getMethod(methodName, argClass);

            // 判断是否存在@DataSourceNote注解
            if (method.isAnnotationPresent(DataSourceNote.class)) {
                DataSourceNote annotation = method.getAnnotation(DataSourceNote.class);
                // 取出注解中的数据源名
                dataSource = annotation.value();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 切换数据源
        DataSourceContextHolder.setDB(dataSource);

    }


    @After("@annotation(com.hontye.DataSource.DataSourceNote)")
    public void afterSwitchDS(JoinPoint point){
        DataSourceContextHolder.clearDB();

    }
}
package com.hontye.DataSource;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;


@Configuration
public class DataSourceConfig {
    @Bean(name = "primaryDataSource")
    @Qualifier("primaryDataSource")//该注解指定注入的Bean的名称,Spring框架使用byName方式寻找合格的 bean,这样就消除了byType方式产生的歧义
    @ConfigurationProperties(prefix = "spring.datasource.primary")//读取配置文件里前缀 为"spring.datasource.primary"的语句
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "primaryJdbcTemplate")
    public JdbcTemplate primaryJdbcTemplate(
            @Qualifier("primaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean(name = "secondaryDataSource")
    @Qualifier("secondaryDataSource")
    //@Primary//有时候我们能保证同一个类型在spring容器中只有一个实例,有时候我们保证不了,此时不讨论by name注入。这个时候@Primary注解就非常重要了
    @ConfigurationProperties(prefix="spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryJdbcTemplate")
    public JdbcTemplate secondaryJdbcTemplate(
            @Qualifier("secondaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    /**
     * 动态数据源: 通过AOP在不同数据源之间动态切换
     *
     * @return
     */
    @Primary
    @Bean(name = "dynamicDS1")
    public DataSource dataSource() {
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        // 默认数据源
        dynamicDataSource.setDefaultTargetDataSource(secondaryDataSource());

        // 配置多数据源
        Map<Object, Object> dsMap = new HashMap(5);
        dsMap.put("secondaryDataSource", secondaryDataSource());
        dsMap.put("primaryDataSource", primaryDataSource());

        dynamicDataSource.setTargetDataSources(dsMap);
        return dynamicDataSource;
    }
    /**
     * 配置@Transactional注解事物
     * @return
     */
    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }
}
package com.hontye.DataSource;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Author: ch
 * @Date: 2018/6/27 11:47
 * @Description:
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({
        ElementType.METHOD
})
public @interface DataSourceNote {
    String value() default "secondaryDataSource";
}
package com.hontye;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.hontye.parameter.quartz.CreateJob;

@Controller
@EnableScheduling
@EnableAutoConfiguration
@SpringBootApplication(
        exclude = {
                DataSourceAutoConfiguration.class
        }
)
//这个注解去除掉默认的数据库配置,然后我们自己去配置database.
public class PlatformSpringBootApplication {
	
	@RequestMapping("/")
	public String index(Model model) {
		return "webSocket";
	}

	/**
	 * @param args
	 */
	public static void main(String[] args){
		SpringApplication.run(PlatformSpringBootApplication.class, args);
		//定时任务
		CreateJob job = new CreateJob();
		job.createJob();
	}

}

使用:

在实现方法上,使用@DataSourceNote即可,指定数据源,默认是secondaryDataSource

        @Override
	@DataSourceNote("primaryDataSource")
	public void run4Hour() throws Exception {
		vuScycService.findAll();
    }

 

SpringBoot配置双数据源(Mysql和Postgre) SpringBoot配置双数据源(Mysql和Postgre) 我们话不多说,直接上操作步骤 一、首先引入依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1 阅读详情

相关推荐

springboot-双数据源配置

先说下大背景--用户数据交互数据业务数据都在同一个数据库上,当有时效的活动比如榜单结束的时候大量用户开始刷排名,导致数据库读写同步压力过大,数据延迟从而产生错误的排名;当时对大数据表已经做了分表处理而且加了缓存,千人榜乃至万人榜的榜单结束是伴随着大量的计算,数据插入,消息推送;mysql IO瞬间就飙到60M;所以在不改变线上系统稳定运行的前提下把用户交互数据移出去。springboot双数据库的...

四明狂客-默默前行的程序猿 4406

SpringBoot多数据源配置

文章目录1 SpringBoot分库配置1.1 准备数据1.2 springboot+mybatis使用分包方式整合1.2.1 pom.xml1.2.2 application.yml 配置文件1.2.3 连接数据源配置文件1.2.3.1 连接源配置一1.2.3.2 连接源配置二1.2.4 项目结构1.3 springboot+druid+mybatisplus使用注解整合1.3.1 pom.xml1.3.2 application.yml 配置文件1.3.3 使用@DS区分数据源1.4 读写分离库1.4.

上善若泪 3万+

如何在Spring Boot中配置双数据源?

如何在Springboot中配置双数据源?

热爱技术,享受生活 2万+

Spring Boot配置多数据源的四种方式

在日常的项目中我们的开发都是采用单数据库的模式,但是在高并发的时代,单数据库已经无法承载大数据量的访问,所以就需要使用多个数据库进行对数据的读写分离。

qq_45515182的博客 3万+

5分钟搞定Google Custom Search API申请:从注册到获取CX Key全流程

本文详细介绍了如何快速申请和配置Google Custom Search API,从Google Cloud项目创建、启用计费、获取API Key,到在Programmable Search Engine控制台创建自定义搜索引擎并获取关键的CX Key,提供了全流程实战指南。文章还包含安全配置建议、API调用测试方法及前端与后端的集成代码示例,帮助开发者高效实现网站或应用的智能搜索功能。

weixin_29227585的博客 1663

基于FPGA 外置qspi Flash的读写

fpga上实现flash读写代码

weixin_43498765的博客 4954

springboot多数据源配置

springboot多数据源配置

weixin_41309817的博客 4770

如何用SoulChat2.0快速克隆你的心理咨询师?手把手教你搭建AI数字孪生体

本文详细介绍了如何利用SoulChat2.0框架快速构建心理咨询师的AI数字孪生体。通过其核心PsyDT技术,仅需少量真实案例即可合成风格数据并微调大模型,从而低成本地创建能高度模仿特定咨询师语言风格和专业技术的AI分身,适用于预约访谈、心理教育等辅助场景,实现高效的人机协作。

julia4scientist的博客 978

Spring Boot 配置双数据源

添加依赖添加 Spring Boot 和数据库驱动的依赖配置数据源在 application.properties 或 application.yml 中分别配置两个数据源的连接信息创建数据源配置类创建两个数据源的配置类,分别配置数据源相关信息配置数据源事务管理器创建两个数据源的事务管理器,并指定数据源配置 JPA 实体管理器工厂创建两个 JPA 实体管理器工厂,并指定数据源和配置信息配置事务注解支持启用事务注解支持,并指定事务管理器在 DAO 层使用数据源。

专注Java(全栈)应用开发,求知若渴,虚心若愚,talk is cheap, show me the code. 3341

机器人视觉实战:用OpenCV搞定手眼标定(附完整C++代码)

本文详细介绍了使用OpenCV实现机器人视觉中的手眼标定技术,包括核心算法、工业场景优化及完整C++代码示例。通过解析坐标系转换问题,提供从数据采集到标定验证的全流程解决方案,帮助开发者在复杂工业环境中实现高精度机械臂与视觉系统的协同作业。

weixin_29306571的博客 481

Coze 上 OpenClaw 完整使用攻略(零代码 + 24 小时在线 + 飞书 / 微信接入)

Coze(扣子)是目前国内零门槛部署 OpenClaw 最友好的平台,无需服务器、不用命令行,5 分钟即可拥有可执行本地 / 云端任务的 AI 助手,还能一键发布到飞书、微信、钉钉等 IM。

hy行者勇哥的博客 2921

springboot配置双数据源

当一个项目中需要调用两个数据库时,这个时候就需要配置双数据源。 先配置配置文件 然后再Application类上加入: @SpringBootApplication( exclude = { DataSourceAutoConfiguration.class } )这个注解去除掉默认的数据库配置,然后我们自己去配置data...

haha_66666的博客 2万+

Mybatis面试题(基础篇)

(1)mybatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。(2)mybatis避免了几乎所有的JDBC代码(说明了mybatis底层用的就是JDBC,只不过是封装了)和手动设置参数以及获取结果集。(3)mybatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的pojo映射成数据库中的记录。

qq_38196449的博客 1687

SpringBoot中双数据源的配置详解

前言申明   springBoot配置双数据源主要是配置类的书写和配置文件的书写,本文采用yml的形式进行配置,mapper和pojo两个个数据库都共用一个路径,dao层分开书写,各自配置文件中直接配置各自扫描路径即可。本文只讲解如何配置双数据源,如需配置单数据源的童鞋,可参看该链接:https://www.cnblogs.com/zblwyj/p/10668803.html 一、导入jar包 ......

lingerlan510的博客 1782

Android应用发布到Google Play的步骤和注意事项

发布Android应用到Google Play是将您的应用分享给全球用户的重要步骤。Google Play是Android平台上最大的应用分发渠道之一,使得开发者可以轻松将他们的应用推广到数百万的用户。在本篇博客中,我们将逐步介绍如何将您的Android应用发布到Google Play,同时提供详细的步骤和注意事项,以及相关的代码示例。

2201_76125261的博客 850

通过Simulink搭建一个智能微电网能量管理系统(Energy Management System, EMS)

通过上述代码实现,您可以逐步创建一个智能微电网能量管理系统。多源能量集成:整合光伏、风力发电、柴油发电机、电池储能等多种能源资源。负荷预测与调度:基于历史数据和天气预报,预测未来负荷和可再生能源输出,进行优化调度。储能系统优化:设计合理的充放电策略,确保储能系统的高效利用和寿命延长。经济性分析:评估不同运行模式下的经济性,考虑电价、维护成本等因素。环境影响评估:分析微电网对环境的影响,如减少碳排放、提高可再生能源利用率等。硬件在环仿真(HILS)

amy_mhd的博客 314

SpringBoot使用JdbcTemplate的双数据源配置

数据源配置: spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver spring.datasource.primary.url=jdbc:mysql://read:3306/sevend?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDate

雪飘雪融的博客 3562

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

springboot 通用mapper双数据源配置

因为项目需要,项目内使用双数据源。我又很懒,不想写单表的简单SQL,就把通用mapper集成进去了。 通用mapper本身配置我就忽略掉了,重点放出双数据源的配置 1、项目结构 application.properties spring.profiles.active=dev corpus.domain=false server.port=8062 #mybatis.mappe...

张斌的博客 4845

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

关于springBoot如何配置双数据源

前言 本文采用springBoot+配置类的方式简单配置Mysql+PostgreSql双数据源。 1.首先导入需要的pom依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runti...

奔跑的大猪蹄子 738

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Spring Boot 双数据源配置

双数据源是指在一个应用程序中同时配置和使用两个不同的数据库连接。一个连接订单数据库,处理业务数据一个连接用户中心数据库,处理用户信息这样的架构设计可以实现数据隔离、业务分离,提升系统的可维护性和扩展性。实现原理基于动态切换。

分享技术,分享经验 1039

springboot配置MYSQL双数据源

前言 springboot配置双数据源时要特别注意springboot的版本号,各个版本号不一样,写法也不一样.我用的是1.5.x,具体写法如下: 项目结构 pom文件 <dependencies> <dependency> <groupId>org.springframework.boot</groupId&g...

上善若水滴世界 3722

springboot配置双mysql数据源

这两天一直在配置双数据源,找了网上很多资料,有的资料写的太乱而且注释不清楚,类不全.像我这样的刚开始配置的新手很难看明白,今天终于配置成功了,我把我总结的整理一下,做个日志以防以后遇到问题 一.创建一个springboot项目其中需要的pom文件: <dependency> <groupId>org.springframework.boot</groupId...

you_ran_jian的博客 707

springboot项目中双数据源的配置

springboot项目中双数据源的配置

weixin_42395975的博客 628
上一篇: Spring Boot项目生成jar包,并在windows服务器中注册成服务,开机启动
下一篇: SmbFile方式获取远程主机文件到本地指定目录
java开发鼻祖
博客等级 码龄10年 151粉丝 57原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值