springboot添加多数据源 以及 动态添加数据源动态切换数据源
<!-- Druid 数据连接池依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
</dependency>
//指定使用Druid做数据源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
//数据源配置一
spring.datasource.sod.driverClassName=oracle.jdbc.driver.OracleDriver
spring.datasource.sod.validationQuery=SELECT 1 FROM DUAL
spring.datasource.sod.filters=stat,wall
spring.datasource.sod.url=jdbc:oracle:thin:@192.168.**.***:1521:xxxx
spring.datasource.sod.username=xxx
spring.datasource.sod.password=xxx //数据源配置二
spring.datasource.base.url=jdbc:oracle:thin:@192.168.**.**:1521:xxxx
spring.datasource.base.username=xxx
spring.datasource.base.password=xxx
多数据源配置:
在熟悉了单实例数据源的实现后,不难看出,在Spring Boot中,通过为该数据源DataSource初始化一个与之对应的SessionFactory,从而实现连接。因此在面对多数据源的时候,可以分别为每个数据源写一个mybatis的config类,使其每个DataSource都拥有一个只属于自己的SessionFactory,这样就可以根据各自的mapper映射目录找到对应的mybaits实例;
这种实现方法要求不同的mybatis实例的mapper映射目录不能相同
把一个配置类作下的Bean命名统一,并注入相应的Bean,从而可以保证每一个SessionFactory所对应的配置信息唯一;具体配置如下:
第一个数据源的配置
SodDataSourceConfig
package com.ch.XX.fetch.config.ds; import com.github.pagehelper.PageHelper;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource;
import java.util.Properties; @Configuration
//扫描 Mapper 接口并容器管理
@MapperScan(basePackages = SodDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "sodSqlSessionFactory")
public class SodDataSourceConfig { // 精确到 sod 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.ch.oneservice.fetch.sodDao";//DAO所在目录
static final String MAPPER_LOCATION = "classpath:mapper/sod/*Mapper.xml";//Mapper.xml所在目录 @Value("${spring.datasource.type}")
private Class<? extends DataSource> dataSourceType;//数据源类型 @Bean(name = "sodDataSource")
@ConfigurationProperties(prefix = "spring.datasource.sod") //application.property中配置文件的前缀
public DataSource sodDataSource() {
return DataSourceBuilder.create().type(dataSourceType).build();
} @Bean(name = "sodPageHelper")
public PageHelper pageHelper() {
PageHelper pageHelper = new PageHelper();
Properties p = new Properties();
p.setProperty("dialect", "oracle");
pageHelper.setProperties(p);
return pageHelper;
} @Bean(name = "sodTransactionManager")
public DataSourceTransactionManager baseTransactionManager() {
return new DataSourceTransactionManager(sodDataSource());
} @Bean(name = "sodSqlSessionFactory")
public SqlSessionFactory baseSqlSessionFactory(@Qualifier("sodDataSource") DataSource sodDataSource,
@Qualifier("sodPageHelper") PageHelper sodPageHelper)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(sodDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(SodDataSourceConfig.MAPPER_LOCATION));
sessionFactory.setPlugins(new Interceptor[]{sodPageHelper});
return sessionFactory.getObject();
}
}
第二个数据源类似
BaseDataSourceConfig
package com.ch.oneservice.fetch.config.ds; import com.github.pagehelper.PageHelper;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource;
import java.util.Properties; @Configuration
// 扫描 Mapper 接口并容器管理
@MapperScan(basePackages = BaseDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "baseSqlSessionFactory")
public class BaseDataSourceConfig { // 精确到 master 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.ch.oneservice.fetch.dao";
static final String MAPPER_LOCATION = "classpath:mapper/base/*Mapper.xml"; @Value("${spring.datasource.type}")
private Class<? extends DataSource> dataSourceType; @Bean(name = "baseDataSource")
@ConfigurationProperties(prefix = "spring.datasource.base")
@Primary
public DataSource baseDataSource() {
return DataSourceBuilder.create().type(dataSourceType).build();
} @Bean(name = "basePageHelper")
public PageHelper pageHelper() {
PageHelper pageHelper = new PageHelper();
Properties p = new Properties();
p.setProperty("dialect", "oracle");
pageHelper.setProperties(p);
return pageHelper;
} @Bean(name = "baseTransactionManager")
@Primary
public DataSourceTransactionManager baseTransactionManager() {
return new DataSourceTransactionManager(baseDataSource());
} @Bean(name = "baseSqlSessionFactory")
@Primary
public SqlSessionFactory baseSqlSessionFactory(@Qualifier("baseDataSource") DataSource baseDataSource,
@Qualifier("basePageHelper") PageHelper basePageHelper)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(baseDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(BaseDataSourceConfig.MAPPER_LOCATION));
sessionFactory.setPlugins(new Interceptor[]{basePageHelper});
return sessionFactory.getObject();
}
}
完成配置文件的配置后,可在工程目录的mapper包下新建两个目录:UserMapper和StudentMapper,分别对应两个数据源。这两个目录只能同级,或者不同目录,不能互为子父目录。
然后使用的时候只需要把相应数据库资源的业务层代码写到对应的包下,项目就可以自己匹配相应的SqlSessionFactory去执行相应的查询
动态数据源加载:
参考如下文章:https://blog.csdn.net/YHYR_YCY/article/details/78894940 写的很详细,我就不重复造轮子了
springboot添加多数据源 以及 动态添加数据源动态切换数据源的更多相关文章
- SpringBoot多数据源动态切换数据源
1.配置多数据源 spring: datasource: master: password: erp_test@abc url: jdbc:mysql://127.0.0.1:3306/M201911 ...
- SpringBoot运行时动态添加数据源
此方案适用于解决springboot项目运行时动态添加数据源,非静态切换多数据源!!! 一.多数据源应用场景: 1.配置文件配置多数据源,如默认数据源:master,数据源1:salve1...,运行 ...
- 动态添加数据源,根据用户登录切换数据库.编程式Spring事务.
根据用户注册,系统自动创建私有数据库,用户登录,动态添加数据源到Spring数据路由,Session超时删除数据源 好处:当数据量大的时候,类似水平切割效果,效率会高一些 坏处:数据源切换,Sprin ...
- 为tomcat动态添加jndi数据源信息
我们在开发项目的时候,总要和数据库打交道,如何获取数据源,以什么样的方式来获取,成为了我们即简单又熟悉而且不得不注意的一个问题. 那么在这里我说三种获取数据源的常用方式: 一.通过配置文件来获取 首先 ...
- Springboot+Mybatis+Pagehelper+Aop动态配置Oracle、Mysql数据源
本文链接:https://blog.csdn.net/wjy511295494/article/details/78825890 Springboot+Mybatis+Pagehelper+Aop ...
- SpringBoot之多数据源动态切换数据源
原文:https://www.jianshu.com/p/cac4759b2684 实现 1.建库建表 首先,我们在本地新建三个数据库名分别为master,slave1,slave2,我们的目前就是写 ...
- elastic-job 分布式定时任务框架 在 SpringBoot 中如何使用(二)动态添加任务需求
之前一篇用过了如何在使用创建最简单的任务:比如每天定时清空系统的缓存 这篇文章主要讲解:如何运用elastic-job-lite做灵活的细粒度任务,比如: 如何定时取消某个订单在下订单后30分钟未支付 ...
- SpringBoot定时任务升级篇(动态添加修改删除定时任务)
需求缘起:在发布了<Spring Boot定时任务升级篇>之后得到不少反馈,其中有一个反馈就是如何动态添加修改删除定时任务?那么我们一起看看具体怎么实现,先看下本节大纲: (1)思路说明: ...
- Springboot+Mybatis AOP注解动态切换数据源
在开发中因需求在项目中需要实现多数据源(虽然项目框架是SpringCloud,但是因其中只是单独的查询操作,觉得没必要开发一个项目,所以采用多数据源来进行实现) 1.在配置文件中创建多个数据连接配置 ...
- springboot集成mongodb实现动态切换数据源
主要实现原理,利用spring的aop 在切入点执行db操作之前 将数据库切换: 本例子采用aop在controller进行拦截 拦截到MongoTemplate.class 切换数据源后重新放回去 ...
随机推荐
- Django1.11加载静态文件
Django版本1.11网站通常需要js,css,images等文件,在Django中,我们把这些文件称为“静态文件”(static files).Django提供django.contrib.sta ...
- 实战一个职业技术学校。 by:hack某某
这是我们的目标,某一技术学院,这是一个注入点 上sqlmap 跑出了管理账号密码 扫后台 没有找到,注入就相当鸡肋了 换换其他思路 dba权限,想到了直接写入 找找路径之类的 找到了,运气相当的好 直 ...
- English Time And Date
What's the Time in English? Explanation There are two common ways of telling the time. Formal but ea ...
- html form禁止表单回车自动提交(通常原因是为在ajax提交前、后进行js判断控制)
@*onkeydown事件用于禁止回车自动提交form,这样就不经过js控制跳转*@ <form action="/Account/CheckPsw" method=&quo ...
- FastJson一些常见方法(API):处理JSON变得好简单
fastjson是目前java语言中最快的json库,比自称最快的jackson速度要快,第三方独立测试结果说明比gson快大约6倍 JSON帮助类 这个可以做一个实例研究代码,也可以作为一个工具类 ...
- js对象属性名驼峰式转下划线
一.题目示例: 思路: 1.匹配属性名字符串中的大写字母和数字 2.通过匹配后的lastIndex属性获取匹配到的大写字母和数字的位置 3.判断大写字母的位置是否为首位置以及lastIndex是否为0 ...
- [ Python ] unittest demo
# -*- coding: utf-8 -*- import unittest class MyUT(unittest.TestCase): def test_1(self): print(" ...
- 斐讯面试记录—TCP滑动窗口及拥塞控制
TCP协议作为一个可靠的面向流的传输协议,其可靠性是由流量控制和滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现. 一.滑动窗口协议 1. “窗口”对应的是一段可以被发送者发送的字节序 ...
- smtplib.SMTPDataError: (554, b'DT:SPM 163……)
1.报错535: 未将POP3/SMTP服务开启.通过在163邮箱内 设置 获取授权码 打开,通过授权码可以进行第三方登录.此处的Password填写授权码. 2.报错554: 第一种情况:缺失发件 ...
- firefox 实现web交互机器人
现在仅有火狐浏览器可以这样操作 -- Filefox 下面是项目目录 -- 前端页面 -- html <!DOCTYPE html> <html lang="en" ...