Spring Boot2.4双数据源的配置

相较于单数据源,双数据源配置有时候在数据分库的时候可能更加有利

但是在参考诸多博客以及书籍(汪云飞的实战书)的时候,发现对于spring boot1.X是完全没问题的,一旦切换到spring boot2.X的时候,就会报出无法实例化出数据源对象等各种问题。我猜测这是无法很好的读取到数据源配置信息的关系。

目前来说,官方文档示例比较好的解决了这个问题

配置双数据源

这里使用java配置方式,需要注意以下几点:

  • 主数据源要加上@Primary注解
  • 需要通过构建DataSourceProperties这个Bean来构建一个数据源,这也是官方文档的示例配置方式,如果采用1.X的方式,很可能会报出jdbcUrl is required with driverClassName这个错误,之后的DataSourceBean,EntityFactoryBean等都会无法实例化
@Configuration
public class DataSourceConfig {
    @Bean
    @Primary
    @ConfigurationProperties("app.datasource.primary")
    public DataSourceProperties firstDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean(name = "primaryDataSource")
    @Primary
    @ConfigurationProperties("app.datasource.primary")
    public DataSource primaryDataSource() {
        return firstDataSourceProperties().initializeDataSourceBuilder().build();
    }

    @Bean
    @ConfigurationProperties("app.datasource.secondary")
    public DataSourceProperties secondDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties("app.datasource.secondary")
    public DataSource secondaryDataSource() {
        return secondDataSourceProperties().initializeDataSourceBuilder().build();
    }
}

配置yml文件

就是在application.yml文件里写一些数据库的配置信息,这个应该都比较轻车熟路了。关于是使用propertiesyml方式,看个人习惯

spring:
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update
app:
  datasource:
    primary:
      url: jdbc:mysql://localhost:3306/kpimanage
      username: root
      password: root123
      maximum-pool-size: 30
      driver-class-name: com.mysql.jdbc.Driver
    secondary:
      url: jdbc:mysql://localhost:3306/local
      username: root
      password: root123
      maximum-pool-size: 30
      driver-class-name: com.mysql.jdbc.Driver

配置Spring Jpa

主要是以下几点:

  • 启动事务管理
  • 定义entity包。也可以不定义,使用默认扫描的方式
  • 定义repository包。也可以不定义,使用默认扫描的方式
  • 自定义EntiryManagerFactoryBean
  • 注意这里只是对使用spring data jpa来说有用,如果使用mybatis的话,根据自身情况配置,这里的配置完全不适用
@Configuration
@EnableTransactionManagement//开启事务管理
@EnableJpaRepositories(basePackages = "com.luzj.dblsource.repository.primary",
entityManagerFactoryRef = "entityManagerFactoryPrimary",
transactionManagerRef = "transactionManagerPrimary")//jpa 配置>repository位置,实体管理Factory配置,事务管理配置
public class PrimaryConfig {

    @Autowired @Qualifier("primaryDataSource")
    DataSource primaryDataSource;

    // 自定义EntityManagerFactory
    @Primary
    @Bean(name = "entityManagerFactoryPrimary")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(primaryDataSource)
                .packages("com.luzj.dblsource.entity.primary") //设置实体类所在位置
                .persistenceUnit("primaryPersistenceUnit")
                .build();
    }

    //自定义EntityManager
    @Primary
    @Bean(name = "entityManagerPrimary")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
    }

    //自定义TransactionManager
    @Primary
    @Bean(name = "transactionManagerPrimary")
    public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactoryPrimary(builder).getObject());
        return transactionManager;
    }
}

同时,第二数据源也如此配置

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.luzj.dblsource.repository.secondary",
entityManagerFactoryRef = "entityManagerFactorySecondary",
transactionManagerRef = "transactionManagerSecondary")
public class SecondaryConfig {
//...
}

测试

配置基本到此结束,下面分别在两个数据库建立不同的table,然后使用repository对表进行操作,看是否能够顺利运行

primary数据库建立Person表以及repository

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Integer id;

    private String address;

    private Integer age;

    private String name;
    //setter getter...
}
public interface PersonRepository extends JpaRepository<Person,Integer> {
}

secondary数据库建立code_river表

@Entity
@Table(name = "code_river")
public class CodeRiver {
    @Id
    @Column(name = "river_id")
    private String id;

    @Column(name = "river_desc")
    private String riverDesc;
    //setter getter ...
}
public interface CodeRiverRepository extends JpaRepository<CodeRiver,String> {
}

单元测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class DblsourceApplicationTests {

    @Test
    public void contextLoads() {
    }
    @Autowired
    private PersonRepository personRepository;
    @Autowired
    private CodeRiverRepository codeRiverRepository;

    @Test
    public void test(){
        personRepository.save(new Person("湖南",23,"章邯"));
        personRepository.save(new Person("纽约",27,"john"));
        personRepository.save(new Person("香港",43,"张一山"));
        personRepository.save(new Person("北京",44,"张朝阳"));
        personRepository.save(new Person("深圳",53,"马化腾"));

        Assert.assertEquals(5,personRepository.findAll().size());

        codeRiverRepository.save(new CodeRiver("area110","阿姆斯特朗回旋加速过海"));
        Assert.assertEquals(1,codeRiverRepository.findAll().size());
    }
}

小结

主要介绍了在springboot 2.4环境下多数据源的配置方式

参考

原文地址:https://www.cnblogs.com/Franken-Fran/p/dbl_datasource.html

时间: 2024-11-05 16:11:59

Spring Boot2.4双数据源的配置的相关文章

SpringBoot Mybatis双数据源的配置

近期因为公司项目的需要,用上了maven和Springboot,对于java开发这块,早闻maven是个好东西,但一直没有去用,感觉用maven帮我们自己做了太多的事情,一个项目跑起来都不知道背后做了些什么,现在想想,可能那个时候脑子进水了吧. Springboot作为Spring的简约版(我是这么叫的,没有任何依据),将原来Spring需要做的配置文件,改为了注解,提供了大量的***start组件来帮我们做了很多初始化的处理. 但是今天我想要分享的不是maven如何搭建一个helloword的

spring与mysql整合数据源的配置

需要解决两点,数据源的配置交给spring完成,事务管理交个spring来管理. <context:property-placeholder location="classpath:conf/jdbc.properties" />//加载文件 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="clo

Spring Boot,Spring Data JPA多数据源支持配置

1 配置文件 wisely.primary.datasource.driverClassName=oracle.jdbc.OracleDriver wisely.primary.datasource.url=jdbc\:oracle\:thin\:@192.168.1.103\:1521\:xe wisely.primary.datasource.username=gis wisely.primary.datasource.password=gis wisely.secondary.dataso

Spring Boot Jpa多数据源配置

前言随着业务量发展,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源,如:user一个库,business一个库.那么接下来我们就要考虑怎么去在spring boot中实现多个数据源的配置. ××× 实现建表首先是建表语句,我们要建立两个数据库,并各库内新建一张表user表mysql> use user:mysql> select * from user;+----+-------+----------+| id | name | password |+----+----

spring boot项目自定义数据源,mybatisplus分页、逻辑删除无效解决方法

Spring Boot项目中数据源的配置可以通过两种方式实现: 1.application.yml或者application.properties配置 2.注入DataSource及SqlSessionFactory两个Bean 通过第二种方式配置数据源则按照MybatisPlus官方文档使用分页及逻辑删除插件会无效,解决思路是在初始化SqlSessionFactory将插件设置进去 /** * 逻辑删除插件 */ @Bean public GlobalConfig globalConfig()

spring 配置双数据源并读写分离

摘自 开源项目Ibase4j    关键思想在于AbstractRoutingSource 类 还有方法名称和切入点去控制使用哪个数据源    1.首先在配置文件配置多个数据源 并且交给继承自spring AbstractRoutingSource去管理 datasource.xml配置如下 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springfram

【转】Spring, MyBatis 多数据源的配置和管理

同一个项目有时会涉及到多个数据库,也就是多数据源.多数据源又可以分为两种情况: 1)两个或多个数据库没有相关性,各自独立,其实这种可以作为两个项目来开发.比如在游戏开发中一个数据库是平台数据库,其它还有平台下的游戏对应的数据库: 2)两个或多个数据库是master-slave的关系,比如有mysql搭建一个 master-master,其后又带有多个slave:或者采用MHA搭建的master-slave复制: 目前我所知道的 Spring 多数据源的搭建大概有两种方式,可以根据多数据源的情况进

复习Spring第三课--数据源配置的多种方式

spring数据源配置可以说分为:spring容器自带连接池.项目中创建连接池.服务器创建连接池三种 一.spring容器自带连接池   Spring本身也提供了一个简单的数据源实现类DriverManagerDataSource ,它位于org.springframework.jdbc.datasource包中.这个类实现了javax.sql.DataSource接口,但 它并没有提供池化连接的机制,每次调用getConnection()获取新连接时,只是简单地创建一个新的连接.因此,这个数据

Spring学习笔记之六(数据源的配置)

1.前言 上一篇博客分析了,Spring中实现AOP的两种动态代理的机制,以下这篇博客.来解说一下Spring中的数据源的配置.  2.DAO支持的模板类 Spring提供了非常多关于Dao支持的模板类,比如HibernateTemplate.JdbcTemplate等,以下以后者为例.来看一个Demo <span style="font-family:SimSun;font-size:18px;">package com.test; import org.springfr