springboot项目中双数据源的配置

2023-10-28

springboot项目中双数据源的配置

@对于一个项目中我们可能会配置多个数据源的情况,因而在这里向大家具体的介绍下如何在项目中配置多个数据源。比如我们配置一个EHR数据源和一个YSJ数据源。

1.pom文件中引入德鲁伊(druid)的依赖

<dependency>
		    <groupId>com.alibaba</groupId>
		    <artifactId>druid</artifactId>
		    <version>1.1.12</version>
		</dependency>

2.在我们的项目启动类中我们需要禁用数据源的自动配置的禁用,同时我们需要注入相关的数据源到spring中形成bean对象。

package com.ylkz;
import com.alibaba.druid.pool.DruidDataSource;
import com.ylkz.base.ApplicationParent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
//配置多数据源前禁用自动配置数据源
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
@EnableFeignClients
@EnableTransactionManagement
@Configuration
public class ServiceDemandApplication extends ApplicationParent
{
    protected Logger logger = LoggerFactory.getLogger(ServiceDemandApplication.class);


	public static void main(String[] args) {
        SpringApplication.run( ServiceDemandApplication.class, args );
    }

    @Bean(name="ysjDataSource")
    @ConfigurationProperties(prefix = "druid.datasource.db-ysj")
    public DataSource ysjDataSource() {
        return new DruidDataSource();
    }
    
    @Bean(name="ehrDataSource")
    @ConfigurationProperties(prefix = "druid.datasource.db-ehr")
    public DataSource ehrDataSource() {
        return new DruidDataSource();
    }
}

3.分别为每个数据源创建一个Config,EHR数据源默认为MybatisConfig,YSJ数据源为MybatisConfig1。该配置文件是为了从sqlSessionFactory工厂中获取相应的数据源Dao层bean对象去连接数据库。

3.1 EHR数据源的配置
/**    
 * <p><b>Description: </b></p>
 * <p><b>Date:</b>  Oct 23, 2018 6:51:50 PM </p> 
 * <p><b>Remark:  </b></p>
 */ 
package com.ylkz.DbConfig;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
/**    
 * <p><b>Description: </b></p>
 * <p><b>Date:</b>  Oct 23, 2018 6:51:50 PM </p> 
 * <p><b>Remark: 凡注册到Spring容器内的bean,实现了EnvironmentAware接口重写setEnvironment方法后,
 * 				  在工程启动时可以获得application.properties的配置文件配置的属性值。 </b></p>
 * @author Sean.Wang  
 */
@Configuration
//此处的basePackages 扫描的是我们Dao接口的路径
@MapperScan(basePackages = {"com.ylkz.Mappers.EhrMapper"}, sqlSessionFactoryRef = "ehrSqlSessionFactory")
public class MybatisConfig implements EnvironmentAware {


    private Environment environment;
    
    @Bean(name = "ehrSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("ehrDataSource") DataSource dataSource) {
        try {
            ResourcePatternResolver resourcePatternResolver;
            resourcePatternResolver = new PathMatchingResourcePatternResolver();

            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
             //这里获取的属性其实是mybatis配置文件中的内容,具体的在下面会讲到
            String typeAliasesPackage = environment.getProperty("mybatis.config.typeAliasesPackage");
            String mapperLocations = environment.getProperty("mybatis.config.mapper-locations");
            String configLocation = environment.getProperty("mybatis.config.configLocation");
//            System.out.println("======>" + typeAliasesPackage);
//            System.out.println("======>" + mapperLocations);
//            System.out.println("======>" + configLocation);

            bean.setTypeAliasesPackage(typeAliasesPackage);
            bean.setMapperLocations(resourcePatternResolver.getResources(mapperLocations));
            bean.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
            return bean.getObject();

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    @Bean
    public PlatformTransactionManager platformTransactionManager(@Qualifier("ehrDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

	/* (non-Javadoc)  
	 * <p>Description: </p>  
	 * @param arg0  
	 * @see org.springframework.context.EnvironmentAware#setEnvironment(org.springframework.core.env.Environment)  
	 */
	@Override
	public void setEnvironment(Environment arg0) {
		// TODO Auto-generated method stub
		this.environment = arg0;
	}
	
	@Bean(name = "ehrSqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("ehrSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
3.2 YSJ数据源的配置
/**
 * <p><b>Description: </b></p>
 * <p><b>Date:</b>  Oct 23, 2018 6:51:50 PM </p>
 * <p><b>Remark:  </b></p>
 */
package com.ylkz.DbConfig1;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

/**
 * <p>
 * <b>Description: </b>
 * </p>
 * <p>
 * <b>Date:</b> Oct 23, 2018 6:51:50 PM
 * </p>
 * <p>
 * <b>Remark: 凡注册到Spring容器内的bean,实现了EnvironmentAware接口重写setEnvironment方法后,
 * 在工程启动时可以获得application.properties的配置文件配置的属性值。 </b>
 * </p>
 *
 * @author Sean.Wang
 */
@Configuration
@MapperScan(basePackages = {
        "com.ylkz.Mappers.YsjMapper"}, sqlSessionFactoryRef = "ysjSqlSessionFactory")
public class MybatisConfig1 implements EnvironmentAware {

    //	这里不能用自动注入,要用下面的方法手动指明配置
    // @Autowired
    // DataSource dataSource;

/*	@Bean(name = "ysjDataSource")
	@ConfigurationProperties(prefix = "druid.datasource.db-ysj")
	public DataSource dataSource() {
		return DataSourceBuilder.create().build();
	}*/

    private Environment environment;

    @Bean(name = "ysjSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("ysjDataSource") DataSource dataSource) {
        try {
            ResourcePatternResolver resourcePatternResolver;
            resourcePatternResolver = new PathMatchingResourcePatternResolver();

            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);

            String typeAliasesPackage = environment.getProperty("mybatis.config1.typeAliasesPackage");
            String mapperLocations = environment.getProperty("mybatis.config1.mapper-locations");
            String configLocation = environment.getProperty("mybatis.config1.configLocation");
            // System.out.println("======>" + typeAliasesPackage);
            // System.out.println("======>" + mapperLocations);
            // System.out.println("======>" + configLocation);

            bean.setTypeAliasesPackage(typeAliasesPackage);
            bean.setMapperLocations(resourcePatternResolver.getResources(mapperLocations));
            bean.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
            return bean.getObject();

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    @Bean
    public PlatformTransactionManager platformTransactionManager(@Qualifier("ysjDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    /*
     * (non-Javadoc) <p>Description: </p>
     *
     * @param arg0
     *
     * @see org.springframework.context.EnvironmentAware#setEnvironment(org.
     * springframework.core.env.Environment)
     */
    @Override
    public void setEnvironment(Environment arg0) {
        // TODO Auto-generated method stub
        this.environment = arg0;
    }

    @Bean(name = "ysjSqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("ysjSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

4.从第三步时需要获取druid中双数据源相关配置,因而在这里我们说一说其相关的配置信息,在这里我们创建application-db.yml配置文件

# 数据库配置
druid:
  datasource:
    db-ehr:
      driverClassName: ${ehr.driverClassName}
      # 注意:allowMultiQueries=true 开启允许多条sql执行
      url: ${ehr.jdbcurl}
      username: ${ehr.username}
      password: ${ehr.password}
      #初始化连接数量,最大最小连接数
      initialSize: 5
      maxActive: 20
      minIdle: 5
      #获取连接等待超时的时间
      maxWait: 600000
      #超过时间限制是否回收
      removeAbandoned: true
      #超过时间限制多长
      removeAbandonedTimeout: 180
      #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 600000
      #配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      #用来检测连接是否有效的sql,要求是一个查询语句
      validationQuery: SELECT 1 FROM sys_user
      #申请连接的时候检测
      testWhileIdle: true
      #申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能
      testOnBorrow: false
      #归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能
      testOnReturn: false
      #打开PSCache,并且指定每个连接上PSCache的大小
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 50
      #属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:
      #监控统计用的filter:stat 日志用的filter:log4j 防御SQL注入的filter:wall
      filters: stat
    db-ysj:
      driverClassName: ${ysj.driverClassName}
      # 注意:allowMultiQueries=true 开启允许多条sql执行
      url: ${ysj.jdbcurl}
      username: ${ysj.username}
      password: ${ysj.password}
      #初始化连接数量,最大最小连接数
      initialSize: 5
      maxActive: 20
      minIdle: 5
      #获取连接等待超时的时间
      maxWait: 600000
      #超过时间限制是否回收
      removeAbandoned: true
      #超过时间限制多长
      removeAbandonedTimeout: 180
      #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 600000
      #配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      #用来检测连接是否有效的sql,要求是一个查询语句
      validationQuery: SELECT 1 FROM code_post
      #申请连接的时候检测
      testWhileIdle: true
      #申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能
      testOnBorrow: false
      #归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能
      testOnReturn: false
      #打开PSCache,并且指定每个连接上PSCache的大小
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 50
      #属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:
      #监控统计用的filter:stat 日志用的filter:log4j 防御SQL注入的filter:wall
      filters: stat

mybatis:
  config:
    typeAliasesPackage: com.ylkz.Beans.Ehr  #此处是实体的具体扫描路径
    mapper-locations: classpath:mybatis/ehrMapper/*Mapper.xml #这里是具体的Mapper.xml文件的扫描地址
    configLocation: classpath:mybatis-spring.xml  #这里是mybatis的具体配置文件地址或者具体的配置文件
  config1:
    typeAliasesPackage: com.ylkz.Beans.Yjs
    mapper-locations: classpath:mybatis/ysjMapper/*Mapper.xml
    configLocation: classpath:mybatis-spring.xml

5.在上一部druid双数据源配置中引用到了mybatis的配置,这里是具体的描述信息mybatis-spring.xml,项目中直接引用的xml文件直接放在resources目录下。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <properties>
        <property name="dialect" value="mysql" />
    </properties>
    <settings>
        <!-- 这个配置使全局的映射器启用或禁用缓存。系统默认值是true,设置只是为了展示出来 -->
        <setting name="cacheEnabled" value="true" />
        <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 系统默认值是true,设置只是为了展示出来 -->
        <setting name="lazyLoadingEnabled" value="false" />
        <!-- 允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动)。 系统默认值是true,设置只是为了展示出来 -->
        <setting name="multipleResultSetsEnabled" value="true" />
        <!--使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动。 系统默认值是true,设置只是为了展示出来 -->
        <setting name="useColumnLabel" value="true" />
        <!--允许 JDBC 支持生成的键。需要适合的驱动。如果设置为 true 则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如
            Derby)。 系统默认值是false,设置只是为了展示出来 -->
        <setting name="useGeneratedKeys" value="false" />
        <!--配置默认的执行器。SIMPLE 执行器没有什么特别之处。REUSE 执行器重用预处理语句。BATCH 执行器重用语句和批量更新 系统默认值是SIMPLE,设置只是为了展示出来 -->
        <setting name="defaultExecutorType" value="SIMPLE" />
        <!--设置超时时间,它决定驱动等待一个数据库响应的时间。 系统默认值是null,设置只是为了展示出来 -->
        <setting name="defaultStatementTimeout" value="25000" />
    </settings>
    <!--<plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <property name="dialect" value="mysql" />
            <property name="offsetAsPageNum" value="true" />
            <property name="rowBoundsWithCount" value="true" />
            <property name="pageSizeZero" value="true" />
            <property name="reasonable" value="true" />
        </plugin>
    </plugins>-->
</configuration>
在这里插入代码片

在本文中介绍了具体的Dao层对象创建的配置文件MybatisConfig,Druid双数据源的配置文件application-db.yml(其中讲述了实体entity,mapper文件sql语句的具体路径配置),mybatis的配置文件mybatis-spring.xml ,以及springboot项目中启动类的配置 。谢谢大家。。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot项目中双数据源的配置 的相关文章

随机推荐

  • Ubuntu时间显示不准确的解决方案

    参考 解决ubuntu里面时间不正确的办法 作者 三速何时sub20 发布时间 2020 12 08 16 24 27 网址 https blog csdn net weixin 44234294 article details 11087
  • Android 图片拖拽、放大缩小的自定义控件

    需求 像相册中的图片跟随手指拖动 双指的放大和缩小 相册中拖出范围之后有弹回的动画 感觉上很圆润 很舒服 我写的例子中并没有加动画 思路 1 自定义DragImageView java 2 自定义中先画图片 图片大于屏幕就把图片缩小后显示
  • [HCTF 2018]admin

    HCTF 2018 admin 一开始发现两个页面 登录页面和注册页面 页面源码说的意思应该是需要admin登录 二话不说 先用 top3000 跑了一下 发现没作用 可能不是考弱口令 看抓包的数据 也不是考xxe 没啥思路了 看看网上说的
  • 本地及远程rsync同步

    问题 本案例要求通过rsync命令工具来完成本地 远程同步操作 了解增量同步的效果 相关命令选项的用途 需要完成的配置任务如下 测试rsync上传 下载同步的基本用法 测试rsync的命令选项 a v delete n的用途 使用rsync
  • 安卓逆向一分钟app脱壳

    免责声明 做视频的初衷是为了学习交流 是想让自己在分享过程中学习到更多的东西 所发布的视频 环境 软件 脚本 文章 资料等 都是为了 粉丝们群友们能够更好的去理解安全测试的知识点 本人发布的视频 环境 软件 脚本 文章 资料等 都只用于学习
  • 如何用python开发app —— 前言

    来了 听说你要学用python开发app的本事 算你来对地方了 我这里有两种 一种是36般变化 一种是72般变化 你要学哪种 哈哈 闲话不多说 直接进入主题 首先说明 笔者 喝卤小夫 本篇文章不是教你具体的制作步骤 具体的步骤请参阅其它博文
  • python DataFrame获取行数、列数、索引及第几行第几列的值

    1 df DataFrame A 11 B 12 A 111 B 121 A 1111 B 1211 print df columns size 列数 2 print df iloc 0 size 行数 3 print df ix 0 in
  • 获取x-sign/x-mini-wua/x-sgext/x-umt

    文章目录 获取x sign x mini wua x sgext x umt 获取应用上下文 获取Mtop 获取MtopConfig 从MtopConfig获得sign对象 创建参数并调用 获取x sign x mini wua x sge
  • Redis第十二讲 Redis之zset底层数据结构实现

    zset zset中的每个元素包含数据本身和一个对应的分数 score ZSet 为有序的 自动去重的集合数据类型 ZSet 数据结构底层实现为 ziplist 或跳表 skiplist zset的数据本身不允许重复 但是score允许重复
  • 【报错】No module named ‘imutils‘

    1 No module named imutils imutils是整合了opencv numpy和matplotlib的相关操作的一个python工具包 主要是用来进行图形图像的处理等等 后又加入了针对视频的处理等 imutils同时支持
  • 从零实现DevOps(一):Centos7安装gitlab详解

    从今日起 开始更新 从零实现DevOps 系列 内容丰富且完整 预计内容包括Gitlab安装 环境变量配置 Jenkins安装和配置 本地 远程 部署单体项目 本地 远程 部署Vue项目 本地 远程 部署微服务项目等 希望能帮助大家 在技术
  • 物美智能系统

    物美智能系统 项目介绍 物美智能 wumei smart 是一个简单易用的生活物联网平台 可用于搭建物联网平台以及二次开发和学习 设备接入使用EMQX消息服务器 加密认证 后端采用Spring boot 前端采用Vue 移动端采用Uniap
  • VBA-读取文件的几种方法用时对比

    不同方法的其他优劣可以参考其余文档 本文仅对比用时 并且由于文件以其他方式读取过会影响下次读取速度 本次结果仅供参考 本人小白 欢迎指正 方法 用时 s 备注 workbook open 0 14 0 39 execut Excel 1 5
  • R语言生存数据进行中介分析(2)--手动推导cox回归中介分析

    中介变量 mediator 是一个重要的统计概念 如果自变量 X 通过某一变量 M 对因变量 Y 产生一定影响 则称 M 为 X 和 Y 的中介变量 目前国内外研究大部分都借鉴因果逐步回归法检验 因果步骤法由 Baron 和 Kenny 1
  • STM32L051测试 (三、I2C协议设备的添加测试)

    前面两篇文章 把L051基本功能都测试过了 确实感觉到ST的CubeMX工具真是好用 对应换芯片的应用来说 着实方便 底层库封装好 上层应用程序基本都一样 今天我们就来把 I2C 设备添加一下 今天正好借这个机会 把I2C的代码优化一下 目
  • SQLite步骤

    C 使用SQLite步骤及示例 1 下载sqlite文件 下载网址 http www sqlite org download html SQLite版本为SQLite 3 11 1 相关文件如下 sqlite dll win32 x86 3
  • Tx-Lcn 5.2 源码打包并上传到nexus私服

    Tx Lcn源码打包并上传到nexus私服 第一步 maven修改setting文件 添加nexus登录用户
  • 深入理解JVM(3)——7种垃圾收集器

    转载自深入理解JVM 3 7种垃圾收集器 如果说收集算法是内存回收的方法论 那么垃圾收集器就是内存回收的具体实现 Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定 因此不同的厂商 版本的虚拟机所提供的垃圾收集器都可能会有很大差别
  • 足球- EDA的历史数据分析并可视化

    足球 EDA的历史数据分析并可视化 背景 数据介绍 探索数据时需要遵循的一些方向 数据处理 导入库 数据探索 数据可视化 赛事分析 主客场比分 相关性分析 时间序列分析 总结 背景 该数据集包括从1872年第一场正式比赛到2023年的44
  • springboot项目中双数据源的配置

    springboot项目中双数据源的配置 对于一个项目中我们可能会配置多个数据源的情况 因而在这里向大家具体的介绍下如何在项目中配置多个数据源 比如我们配置一个EHR数据源和一个YSJ数据源 1 pom文件中引入德鲁伊 druid 的依赖