SpringBoot集成多数据源解析

一,前面我们介绍了springboot的快速启动,大家肯定对springboot也有所了解,下面我们来介绍一下springboot怎么集成多数据源。

在有的项目开发中需要在一个项目中访问多个数据源或者两个项目之间通信(实质上是互相访问对方的数据库),在这里,我们介绍一下在一个项目中如何集成多个数据源(即访问多个不同的数据库),因为在项目中有时会有这种需求,比如在一个大型项目开发中,一个数据库中保存数据的索引,各种使用频繁的数据,另一个数据库中保存其他的数据。

1.下面我们来讨论一个问题,怎么集成多数据源,就是怎么让一个项目访问多个数据库?

有的人会说使用注解,没错,这是一种办法,因为springboot对的最大好处就是避免了繁琐的xml配置文件,大量的使用注解来开发,方便简洁,但是在这里如果集成多数据源使用注解的话会很麻烦,有没有其他的办法呢?答案是肯定的,我们可以分模板来访问多个数据库,也就是分包。

2.如何分包来访问多个数据源?

在这里,我们用一个简单的案例来说明,我们访问新建一个spingboot项目,访问test1,test2这两个数据库,首先,我们先看代码。

首先,我们需要导入相关依赖在pom文件中,这里,因为我的项目已经提前有了父pom,所以不再考虑依赖的版本问题,怎么建立父pom可参考上一篇文章。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <parent>
  <groupId>cn.shinelon.springboot</groupId>
  <artifactId>microboot</artifactId>
  <version>0.0.1-SNAPSHOT</version>
 </parent>
 <artifactId>springboot-MultiDatasources</artifactId>
 <packaging>war</packaging>

 <!-- maven项目packaging改为war类型时,必须要加这个插件 -->
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 测试springboot的依赖 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

  <!-- 测试时加入这两个依赖,当修改代码的时候就不用每次修改后重启服务器了 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>springloaded</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
  </dependency>
  <!-- springboot 集成jsp必须要借助这两个依赖 -->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
  </dependency>
  <!-- springboot集成mybatis -->
  <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.0</version>
  </dependency>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
  </dependency>
 </dependencies>
</project>

在上面配置的pom文件中,有点要说明,因为要访问数据库,所以我整合了mybatis,还有一个是整合jsp,不过在这个项目中无关,是我之前写代码留下来的,可不必关心。

下面,我们还要在scr/main/sources目录下新建一个application.properties资源文件,注意,这个文件名必须是application,这个是固定的,springboot默认访问该文件,不要自己乱改名称。然后在这个资源文件中配置自定义数据源。

spring.datasource.test1.driverClassName=com.mysql.jdbc.Driver
spring.datasource.test1.url=jdbc:mysql://localhost:3306/test1
spring.datasource.test1.username=root
spring.datasource.test1.password=.....

spring.datasource.test2.driverClassName=com.mysql.jdbc.Driver
spring.datasource.test2.url=jdbc:mysql://localhost:3306/test2
spring.datasource.test2.username=root
spring.datasource.test2.password=.....

配置好数据源后我们就可以开进行分模块来访问这两个数据源了。首先在src/mian/java目录下创建好各个包,然后开始开发,新建一个datasource包来放置需要访问的两个数据源的代码,然后在新建两个模块包test1和test2,从包名我们就可以看出来这两个包是用来操作这两个数据库,在这两个包下可以分别建立DAO层和service层的包,然后建立一个controller控制层。下面是项目的目录树图。

然后我们来写DataSource中的代码,其实就是像我们以前在xml文件中配置的SqlSessionFactory和数据源一个原理。

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.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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
@Configuration
@MapperScan(basePackages="cn.shinelon.test1",sqlSessionFactoryRef="test1SqlSessionFactory")
public class Datasource1 {
  /**
   * 配置test1数据库
   * @return
   */
  @Bean(name="test1Datasource")
  @ConfigurationProperties(prefix="spring.datasource.test1")
  public DataSource testDatasource() {
    return DataSourceBuilder.create().build();
  }
  /**
   * 创建SqlSessionFactory
   * @param dataSource
   * @return
   * @throws Exception
   */
  @Bean(name="test1SqlSessionFactory")
  public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1Datasource")DataSource dataSource)
      throws Exception {
    SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
    bean.setDataSource(dataSource);
    //如果还有分页等其他事务
//   bean.setMapperLocations(new PathMatchingResourcePatternResolver().
//       getResources("classpath:mybatis/test1/*.xml"));
    return bean.getObject();
  }
  /**
   * 配置事务管理
   * @param dataSource
   * @return
   */
  @Bean(name="test1TransactionManager")
  public DataSourceTransactionManager testTransactionManager(
      @Qualifier("test1Datasource")DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
  }
  @Bean(name="test1SqlSessionTemplate")
  public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test1SqlSessionFactory")
  SqlSessionFactory sqlSessionFactory) {
    return new SqlSessionTemplate(sqlSessionFactory);
  }
}

上面的是访问的test1数据库的配置,需要注意的是@ConfigurationProperties(prefix=”spring.datasource.test1”)这个配置中的属性prefix的值必须和资源文件中的前缀是一样的,否则是访问不到的,还有@Primary ,如果不加这个注解,启动将会报错,因为服务器先要有一个默认不知道默认要先访问的数据源是哪个,必须指明,下面是test2数据库的配置,和上面一样的。

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.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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

@Configuration
@MapperScan(basePackages="cn.shinelon.test2",sqlSessionFactoryRef="test2SqlSessionFactory")
@Primary    //指定 默认的访问的数据源
public class Datasource2 {
  /**
   * 配置test2数据库
   * @return
   */
  @Bean(name="test2Datasource")
  @ConfigurationProperties(prefix="spring.datasource.test2")
  @Primary    //指定 默认的访问的数据源
  public DataSource testDatasource() {
    return DataSourceBuilder.create().build();
  }
  /**
   * 创建SqlSessionFactory
   * @param dataSource
   * @return
   * @throws Exception
   */
  @Bean(name="test2SqlSessionFactory")
  @Primary    //指定 默认的访问的数据源
  public SqlSessionFactory testSqlSessionFactory(@Qualifier("test2Datasource")DataSource dataSource)
      throws Exception {
    SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
    bean.setDataSource(dataSource);
    //如果还有分页等其他事务
//   bean.setMapperLocations(new PathMatchingResourcePatternResolver().
//       getResources("classpath:mybatis/test2/*.xml"));
    return bean.getObject();
  }
  /**
   * 配置事务管理
   * @param dataSource
   * @return
   */
  @Bean(name="test2TransactionManager")
  @Primary    //指定 默认的访问的数据源
  public DataSourceTransactionManager testTransactionManager(
      @Qualifier("test2Datasource")DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
  }

  @Bean(name="test2SqlSessionTemplate")
  public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("test2SqlSessionFactory")
  SqlSessionFactory sqlSessionFactory) {
    return new SqlSessionTemplate(sqlSessionFactory);
  }
}

然后我们在每一个模块中写DAO层和service代码来进行操作。
DAO层代码如下

public interface User1Dao {
  @Insert("insert into user values(null,#{username},#{age})")
  public void insert(@Param("username")String username,@Param("age")int age);
}

在这里,我们向数据库插入一条数据。
service层代码如下

@Service
public class User1Service {
  @Autowired
  public User1Dao user1Dao;

  public void insert(String username,int age) {
    user1Dao.insert(username, age);
  }
}

test2包下DAO层和service层的代码都是同样的,这里就省略了。
然后我们来开始写controller层的代码。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import cn.shinelon.test1.services.User1Service;
import cn.shinelon.test2.services.User2Service;

@SpringBootApplication
@ComponentScan(basePackages={"cn.shinelon.datasource","cn.shinelon.test1","cn.shinelon.test2"})
@RestController
public class UserController {
  @Autowired
  public User1Service user1Service;
  @Autowired
  public User2Service user2Service;
  @RequestMapping("/add")
  public String insert(String username,int age) {
    user1Service.insert(username, age);
    user2Service.insert(username, age);
    return "insert success";
  }

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

上面代码中 ,需要注意的是@ComponentScan(basePackages={“cn.shinelon.datasource”,”cn.shinelon.test1”,”cn.shinelon.test2”})这个注解,必须添加,这样服务器才会扫描到这几个包中的配置。

下面我们补全代码,还要建立一个实体类

public class User {
  private int id;
  private String username;
  private int age;
  //省略get,set方法
  }

最后的整个项目图如下

总结

以上就是本文关于SpringBoot集成多数据源解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Maven管理SpringBoot Profile详解、springboot扫描自定义的servlet和filter代码详解、浅谈Springboot之于Spring的优势等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!

(0)

相关推荐

  • 解决spring boot 1.5.4 配置多数据源的问题

    spring boot 已经支持多数据源配置了,无需网上好多那些编写什么类的,特别麻烦,看看如下解决方案,官方的,放心! 1.首先定义数据源配置 #=====================multiple database config============================ #ds1 first.datasource.url=jdbc:mysql://localhost/test?characterEncoding=utf8&useSSL=true first.datasou

  • 详解基于Spring Boot与Spring Data JPA的多数据源配置

    由于项目需要,最近研究了一下基于spring Boot与Spring Data JPA的多数据源配置问题.以下是传统的单数据源配置代码.这里使用的是Spring的Annotation在代码内部直接配置的方式,没有使用任何XML文件. @Configuration @EnableJpaRepositories(basePackages = "org.lyndon.repository") @EnableTransactionManagement @PropertySource("

  • springboot + mybatis配置多数据源示例

    在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1)DatabaseType列出所有的数据源的key---key 2)DatabaseContextHolder是一个线程安全的DatabaseType容器,并提供了向其中设置和获取DatabaseType的方法 3)DynamicDataSource继承AbstractRoutingDataSource并重写其中的方法determineCurrentLookupKey(),在该方法中使用Da

  • Spring Boot多数据源及其事务管理配置方法

    准备工作 先给我们的项目添加Spring-JDBC依赖和需要访问数据库的驱动依赖. 配置文件 spring.datasource.prod.driverClassName=com.mysql.jdbc.Driver spring.datasource.prod.url=jdbc:mysql://127.0.0.1:3306/prod spring.datasource.prod.username=root spring.datasource.prod.password=123456 spring

  • 详解SpringBoot和Mybatis配置多数据源

    目前业界操作数据库的框架一般是 Mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑.在SpringBoot中也可以实现多数据源并配合Mybatis框架编写xml文件来执行SQL.在SpringBoot中,配置多数据源的方式十分便捷, 下面开始上代码: 在pom.xml文件中需要添加一些依赖 <!-- Spring Boot Mybatis 依赖 --> <dependency> <groupId>org.mybatis.spring.b

  • 详解Spring Boot整合Mybatis实现 Druid多数据源配置

    一.多数据源的应用场景 目前,业界流行的数据操作框架是 Mybatis,那 Druid 是什么呢? Druid 是 Java 的数据库连接池组件.Druid 能够提供强大的监控和扩展功能.比如可以监控 SQL ,在监控业务可以查询慢查询 SQL 列表等.Druid 核心主要包括三部分: 1. DruidDriver 代理 Driver,能够提供基于 Filter-Chain 模式的插件体系. 2. DruidDataSource 高效可管理的数据库连接池 3. SQLParser 当业务数据量达

  • Spring Boot 集成Mybatis实现主从(多数据源)分离方案示例

    本文将介绍使用Spring Boot集成Mybatis并实现主从库分离的实现(同样适用于多数据源).延续之前的Spring Boot 集成MyBatis.项目还将集成分页插件PageHelper.通用Mapper以及Druid. 新建一个Maven项目,最终项目结构如下: 多数据源注入到sqlSessionFactory POM增加如下依赖: <!--JSON--> <dependency> <groupId>com.fasterxml.jackson.core<

  • 详解springboot+mybatis多数据源最简解决方案

    说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多,大都是根据jpa来做多数据源解决方案,要不就是老的spring多数据源解决方案,还有的是利用aop动态切换,感觉有点小复杂,其实我只是想找一个简单的多数据支持而已,折腾了两个小时整理出来,供大家参考. 废话不多说直接上代码吧 配置文件 pom包就不贴了比较简单该依赖的就依赖,主要是数据库这边的配置: mybatis.config-locations=classpath:

  • SpringBoot集成多数据源解析

    一,前面我们介绍了springboot的快速启动,大家肯定对springboot也有所了解,下面我们来介绍一下springboot怎么集成多数据源. 在有的项目开发中需要在一个项目中访问多个数据源或者两个项目之间通信(实质上是互相访问对方的数据库),在这里,我们介绍一下在一个项目中如何集成多个数据源(即访问多个不同的数据库),因为在项目中有时会有这种需求,比如在一个大型项目开发中,一个数据库中保存数据的索引,各种使用频繁的数据,另一个数据库中保存其他的数据. 1.下面我们来讨论一个问题,怎么集成

  • 基于springboot集成hbase过程解析

    这篇文章主要介绍了基于springboot集成hbase过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 springboot-habse: https://github.com/spring-projects/spring-hadoop-samples/tree/master/hbase 依赖: <dependency> <groupId>org.springframework.data</groupId> &

  • springboot集成swagger过程解析

    这篇文章主要介绍了springboot集成swagger过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 springboot集成swagger 1.pom.xml中引入: <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2

  • SpringBoot 集成 Druid过程解析

    Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池.更多资料说明大家可以查看官网 Github:https://github.com/alibaba/druid Druid官方已经编写好了相关的启动器,我们可以引入启动器,然后进行相关配置就可以使用Druid的各种功能.如果只是引入Druid依赖包,没有引入Druid的SpringBoot启动

  • Springboot集成jdbcTemplate过程解析

    一 说明 实际工作中其实很少会用到jdbcTemplate去操作数据库,因为其使用方式不是很灵活,sql的拼接能力不强:实际上jdbcTemplate是属于spring自带的数据层模板,在spring中可以说是比较失败的一个案例,原因是当代流行mybatis当做持久层访问数据库,其优越的sql拼接能力.动态sql.半自动化映射.和易于sql优化的特性,深受广大互联网公司的喜爱,并且mybatis的市场占有率不断的上升,hibernate的市场不断缩水,可以说hibernate已经这种强映射关系的

  • Spring-boot集成pg、mongo多数据源过程详解

    这篇文章主要介绍了Spring-boot集成pg.mongo多数据源过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 修改POM文件,增加相应Jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </

  • Springboot 集成 lombok.jar过程解析

    这篇文章主要介绍了Springboot 集成 lombok.jar过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 介绍 Spring Boot是非常高效的开发框架,lombok是一套代码模板解决方案,将极大提升开发的效率,这里介绍给大家使用. Lombok想要解决了的是在我们实体Bean中大量的Getter/Setter方法,以及toString, hashCode等可能不会用到,但是某些时候仍然需要复写,以期方便使用的方法:在使用Lo

  • SpringBoot集成nacos动态刷新数据源的实现示例

    前言 因为项目需要,需要在项目运行过程中能够动态修改数据源(即:数据源的热更新).这里以com.alibaba.druid.pool.DruidDataSource数据源为例 第一步:重写DruidAbstractDataSource类 这里为什么要重写这个类:因为DruidDataSource数据源在初始化后,就不允许再重新设置数据库的url和userName public void setUrl(String jdbcUrl) { if (StringUtils.equals(this.jd

  • springboot集成mybatisPlus+多数据源的实现示例

    该项目主要实现mybatisplus.多数据源.lombok.druid的集成 主要参考 https://mp.baomidou.com/guide/quick-start.html 项目地址:https://github.com/Blankwhiter/mybatisplus-springboot release1.0 项目结构: 一.创建表以及测试数据 CREATE TABLE user ( id VARCHAR(32) NOT NULL COMMENT '主键ID', name VARCH

  • springboot集成@DS注解实现数据源切换的方法示例

    目录 启用@DS实现数据源切换 POM内添加核心jar包 yml配置 “核心”-使用@DS注解 最后 启用@DS实现数据源切换 POM内添加核心jar包         <dependency>             <groupId>com.baomidou</groupId>             <artifactId>dynamic-datasource-spring-boot-starter</artifactId>        

随机推荐