iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么在SpringBoot中实现多数据库连接
  • 951
分享到

怎么在SpringBoot中实现多数据库连接

2023-06-14 06:06:22 951人浏览 泡泡鱼
摘要

怎么在SpringBoot中实现多数据库连接?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。主要使用两个不同的数据库,分别为:mysql(springboot)【primar

怎么在SpringBoot中实现多数据库连接?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

主要使用两个不同的数据库,分别为:

  • mysql(springboot)【primary,优先搜寻该数据库】:Mysql数据库,包含User的信息

  • oracle(springboot): oracle数据库, 包含Country信息

项目依赖

为了支持mysql和Oracle数据库,我们必须要在pom.xml文件中添加相应的依赖。

<dependencies>  <dependency>    <groupId>com.oracle</groupId>    <artifactId>ojdbc6</artifactId>    <version>11.2.0.3.0</version>    <scope>compile</scope>  </dependency>  <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>  </dependency>  <dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-jpa</artifactId>  </dependency>  <dependency>    <groupId>javax.persistence</groupId>    <artifactId>javax.persistence-api</artifactId>    <version>2.2</version>  </dependency>  <dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.18.12</version>  </dependency></dependencies>

包管理

为了方便代码的开发,我们将mysql和oracle分开放在两个不同的package下面,具体的包结构如下:

怎么在SpringBoot中实现多数据库连接

将不同的模型分开放入mysql和oracle包目录下,需要注意的是,mysql和oracle为两个不同的数据库,所以两个数据库中可能存在某个表名称一致的场景。该场景下,会优先匹配primary的数据库,如果该数据库down了,才会匹配另外一张表。所以,如果想要两张表都正常使用,建议使用不同的Entity名称。

数据库连接配置

我们在属性文件application.properties中分别配置两个单独的jdbc连接,将所有关联的Entity类和Repository映射到两个不同的包中。

## jdbc-primaryspring.datasource.url=jdbc:mysql://localhost:33306/springboot?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=falsespring.datasource.username=springbootspring.datasource.passWord=123456spring.ds_mysql.driverClassName=com.mysql.jdbc.Driver## jdbc-secondspring.second.datasource.url=jdbc:oracle:thin:@localhost:1909/xxx.xxx.comspring.second.datasource.userName=springbootspring.second.datasource.password=123456spring.second.datasource.driver-class-name=oracle.jdbc.OracleDriver## jpaspring.jpa.hibernate.ddl-auto=nonespring.jpa.show-sql=truespring.jpa.properties.hibernate.jdbc.time_zone=UTCspring.jpa.properties.hibernate.jdbc.fetch_size=500spring.jpa.properties.hibernate.jdbc.batch_size=100

数据源配置

需要注意的是,在配置多个数据源期间,必须将其中一个数据源标记为primary,否则Spring Boot会检测到多个类型的数据源,从而无法正常启动。

定义Data Source的Bean

想要创建Data Source,我们必须先实例化org.springframework.boot.autoconfigure.jdbc.DataSourceProperties类,加载application.properties文件中配置的数据库连接信息,并通过DataSourceProperties对象的初始化builder方法创建一个javax.sql.DataSource对象。

primary Data Source

@Primary@Bean(name = "mysqlDataSourceProperties")@ConfigurationProperties("spring.datasource")public DataSourceProperties dataSourceProperties() {  return new DataSourceProperties();}@Primary@Bean(name = "mysqlDataSource")@ConfigurationProperties("spring.datasource.configuration")public DataSource dataSource (@Qualifier("mysqlDataSourceProperties") DataSourceProperties mysqlDataSourceProperties) {  return mysqlDataSourceProperties.initializeDataSourceBuilder()      .type(HikariDataSource.class)      .build();}

Secondary Data Source

@Bean(name = "oracleDataSourceProperties")@ConfigurationProperties("spring.second.datasource")public DataSourceProperties dataSourceProperties() {  return new DataSourceProperties();}@Bean@ConfigurationProperties("spring.second.datasource.configuration")public DataSource oracleDataSource(@Qualifier("oracleDataSourceProperties") DataSourceProperties oracleDataSourceProperties) {  return oracleDataSourceProperties.initializeDataSourceBuilder()      .type(HikariDataSource.class)      .build();}

我们使用@Qualifier注解,自动关联指定的DataSourceProperties.

定义实体类管理工厂的Bean

上面说了,应用程序使用Spring Data JPA的repository接口将我们从实体管理器(Entity Manager)中抽象出来,从而进行数据的访问。这里,我们使用org.springframework.ORM.jpa.LocalContainerEntityManagerFactoryBean这个Bean来创建EM实例,后面利用这个EM实例与JPA entities进行交互。

由于我们这里有两个数据源,所以我要为每个数据源单独创建一个EntityManagerFactory。

Primary Entity Manager Factory

@Primary@Bean(name = "mysqlEntityManagerFactory")public LocalContainerEntityManagerFactoryBean entityManagerFactory(    EntityManagerFactoryBuilder builder, @Qualifier("mysqlDataSource") DataSource mysqlDataSource) {  return builder.dataSource(mysqlDataSource)      .packages("com.example.demo.model.mysql")      .persistenceUnit("mysql")      .build();}

Secondary Entity Manager Factory

@Bean(name = "oracleEntityManagerFactory")public LocalContainerEntityManagerFactoryBean oracleEntityManagerFactory(    EntityManagerFactoryBuilder builder, @Qualifier("oracleDataSource") DataSource oracleDataSource) {  return builder.dataSource(oracleDataSource)      .packages("com.example.demo.model.oracle")      .persistenceUnit("oracle")      .build();}

我们使用@Qualifie注解,自动将DataSource关联到对应的EntityManangerFactory中。
在这里我们可以分别配置实体类管理工厂所管理的packages,为了方便开发和阅读,分别将mysql和oracle关联的实体类放在对应的目录下。

事务管理

我们为每个数据库创建一个JPA事务管理器。
查看源码我们可以发现JPA事务管理器需要EntityManangerFactory作为入参,所以利用上述定义的EntityMangerFactory分别生成对应的JPA事物管理器。

源码:

public JpaTransactionManager(EntityManagerFactory emf) {  this();  this.entityManagerFactory = emf;  this.afterPropertiesSet();}

Primary transaction manager

@Primary@Bean(name = "mysqlTransactionManager")public PlatformTransactionManager mysqlTransactionManager(final @Qualifier("mysqlEntityManagerFactory")                                 LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory) {  return new JpaTransactionManager(mysqlEntityManagerFactory.getObject());}

Secondary transaction manager

@Bean(name = "oracleTransactionManager")public PlatformTransactionManager oracleTransactionManager(    final @Qualifier("oracleEntityManagerFactory")        LocalContainerEntityManagerFactoryBean oracleEntityManagerFactory) {  return new JpaTransactionManager(oracleEntityManagerFactory.getObject());}

JPA Repository配置

由于我们使用了两个不同的数据源,所以我们必须使用@EnableJpaRepositories注解为每个数据源提供特定的信息。
进入该注解源码,我们可以发现默认值如下:

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@Import(JpaRepositoriesReGIStrar.class)public @interface EnableJpaRepositories {    String[] basePackages() default {};      String entityManagerFactoryRef() default "entityManagerFactory";      String transactionManagerRef() default "transactionManager";}

这里仅列了一些我们关心的方法。

从源码我中我们可以看见,

  • basePackages: 使用此字段设置Repository的基本包,必须指向软件包中repository所在目录。

  • entityManagerFactoryRef:使用此字段引用默认或自定义的Entity Manager Factory, 这里通过Bean的名称进行指定, 默认Bean为entityManagerFactory。

  • transactionManagerRef:使用此字段引用默认或自定义的事务管理器,这里通过Bean的名称进行指定,默认Bean为transactionManager。

通过上面的内容,我们为两个不同的数据源分别定义了不同的名称,所以我们需要在这里分别将其注入容器中。

Primary

@Configuration@EnableTransactionManagement@EnableJpaRepositories(basePackages = {"com.example.demo.repository.mysql"},    entityManagerFactoryRef = "mysqlEntityManagerFactory", transactionManagerRef = "mysqlTransactionManager")public class MysqlDataSourceConfiguration {  ...}

secondary

@Configuration@EnableTransactionManagement@EnableJpaRepositories(basePackages = "com.example.demo.repository.oracle",    entityManagerFactoryRef = "oracleEntityManagerFactory", transactionManagerRef = "oracleTransactionManager")public class OracleDataSourceConfiguration {  ...}

完整的配置文件

primary

@Configuration@EnableTransactionManagement@EnableJpaRepositories(basePackages = {"com.example.demo.repository.mysql"},    entityManagerFactoryRef = "mysqlEntityManagerFactory", transactionManagerRef = "mysqlTransactionManager")public class MysqlDataSourceConfiguration {  @Primary  @Bean(name = "mysqlDataSourceProperties")  @ConfigurationProperties("spring.datasource")  public DataSourceProperties dataSourceProperties() {    return new DataSourceProperties();  }  @Primary  @Bean(name = "mysqlDataSource")  @ConfigurationProperties("spring.datasource.configuration")  public DataSource dataSource (@Qualifier("mysqlDataSourceProperties") DataSourceProperties mysqlDataSourceProperties) {    return mysqlDataSourceProperties.initializeDataSourceBuilder()        .type(HikariDataSource.class)        .build();  }  @Primary  @Bean(name = "mysqlEntityManagerFactory")  public LocalContainerEntityManagerFactoryBean entityManagerFactory(      EntityManagerFactoryBuilder builder, @Qualifier("mysqlDataSource") DataSource mysqlDataSource) {    return builder.dataSource(mysqlDataSource)        .packages("com.example.demo.model.mysql")        .persistenceUnit("mysql")        .build();  }  @Primary  @Bean(name = "mysqlTransactionManager")  public PlatformTransactionManager transactionManager(final @Qualifier("mysqlEntityManagerFactory")                                   LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory) {    return new JpaTransactionManager(mysqlEntityManagerFactory.getObject());  }}

secondary

@Configuration@EnableTransactionManagement@EnableJpaRepositories(basePackages = "com.example.demo.repository.oracle",    entityManagerFactoryRef = "oracleEntityManagerFactory", transactionManagerRef = "oracleTransactionManager")public class OracleDataSourceConfiguration {  @Bean(name = "oracleDataSourceProperties")  @ConfigurationProperties("spring.second.datasource")  public DataSourceProperties dataSourceProperties() {    return new DataSourceProperties();  }  @Bean  @ConfigurationProperties("spring.second.datasource.configuration")  public DataSource oracleDataSource(@Qualifier("oracleDataSourceProperties") DataSourceProperties oracleDataSourceProperties) {    return oracleDataSourceProperties.initializeDataSourceBuilder()        .type(HikariDataSource.class)        .build();  }  @Bean(name = "oracleEntityManagerFactory")  public LocalContainerEntityManagerFactoryBean oracleEntityManagerFactory(      EntityManagerFactoryBuilder builder, @Qualifier("oracleDataSource") DataSource oracleDataSource) {    return builder.dataSource(oracleDataSource)        .packages("com.example.demo.model.oracle")        .persistenceUnit("oracle")        .build();  }  @Bean  public PlatformTransactionManager oracleTransactionManager(      final @Qualifier("oracleEntityManagerFactory")          LocalContainerEntityManagerFactoryBean oracleEntityManagerFactory) {    return new JpaTransactionManager(oracleEntityManagerFactory.getObject());  }}

关于怎么在SpringBoot中实现多数据库连接问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: 怎么在SpringBoot中实现多数据库连接

本文链接: https://www.lsjlt.com/news/268641.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在SpringBoot中实现多数据库连接
    怎么在SpringBoot中实现多数据库连接?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。主要使用两个不同的数据库,分别为:mysql(springboot)【primar...
    99+
    2023-06-14
  • SpringBoot多数据库连接(mysql+oracle)的实现
    出于业务需求,有时我们需要在spring boot web应用程序中配置多个数据源并连接到多个数据库。 使用过Spring Boot框架的小伙伴们,想必都发现了Spring Boot...
    99+
    2024-04-02
  • SpringBoot中怎么连接数据库
    在SpringBoot中连接数据库通常需要以下几个步骤: 1、添加数据库驱动依赖:在pom.xml文件中添加所需数据库的驱动依赖,例...
    99+
    2024-03-07
    SpringBoot 数据库
  • 怎么在Spring\SpringBoot中配置连接数据库
    怎么在Spring\SpringBoot中配置连接数据库?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Spring配置连接数据库设置jdbc.propertiesjdbc....
    99+
    2023-06-15
  • 怎么在SpringBoot中使用Druid数据库连接池
    这篇文章主要介绍怎么在SpringBoot中使用Druid数据库连接池,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Druid是阿里开源的一款数据库连接池,除了常规的连接池功能外,它还提供了强大的监控和扩展功能。这对...
    99+
    2023-06-14
  • springboot怎么连接两个数据库
    这篇“springboot怎么连接两个数据库”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springboot怎么连接两个数...
    99+
    2023-06-29
  • Python中怎么实现数据库连接池
    这篇文章将为大家详细讲解有关Python中怎么实现数据库连接池,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。示例:#-*-coding:utf-8-*-  import ...
    99+
    2023-06-17
  • springboot怎么连接不同数据库
    今天小编给大家分享一下springboot怎么连接不同数据库的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。MySQL当url...
    99+
    2023-07-06
  • C#怎么使用ADO.Net连接数据库与实现多数据库访问
    本文小编为大家详细介绍“C#怎么使用ADO.Net连接数据库与实现多数据库访问”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么使用ADO.Net连接数据库与实现多数据库访问”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-06-30
  • Oracle中怎么实现本地数据库连接
    Oracle中怎么实现本地数据库连接,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一:创建数据库表空间和用户名createtablespace...
    99+
    2024-04-02
  • 怎么在IDEA中连接Navicat数据库
    怎么在IDEA中连接Navicat数据库?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。(一)配置环境变量①我的电脑右键选择属性→高级系统设置→环境变量→新建→输入变量名MYSQ...
    99+
    2023-06-14
  • 怎么在Android中连接MongoDB数据库
    怎么在Android中连接MongoDB数据库?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。MongoDB简介Mongodb,分布式文档存储数据库,由C++语言编写,旨在为...
    99+
    2023-05-30
    android mongodb
  • 怎么在python中连接mysql数据库
    这期内容当中小编将会给大家带来有关怎么在python中连接mysql数据库,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;...
    99+
    2023-06-14
  • springboot如何连接两个数据库(多个)
    目录一、启动类二、application.yml文件三、创建配置类四 、结构五、多数据源的事物问题一、启动类 1.启动类需要不用加mybatis的@MapperScan注解 @Spr...
    99+
    2024-04-02
  • 怎么在plsql中连接oracle数据库
    这篇文章将为大家详细讲解有关怎么在plsql中连接oracle数据库,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。第一步:先安装plsql客户端,plsql...
    99+
    2024-04-02
  • JDBC数据库连接池 怎么实现
    本篇内容介绍了“JDBC数据库连接池 怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么情况下使用连接池对于一个简单的数据库应用,由...
    99+
    2023-06-02
  • django连接数据库mysql怎么实现
    要在Django中连接MySQL数据库,首先需要安装MySQL数据库驱动程序。可以通过以下命令安装MySQL数据库驱动程序: pip...
    99+
    2024-04-09
    django mysql
  • C++怎么实现数据库连接池
    本文小编为大家详细介绍“C++怎么实现数据库连接池”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么实现数据库连接池”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。项目背景为了提高Mysql数据库的访问瓶颈...
    99+
    2023-07-05
  • spring怎么连接多个数据库
    在Spring中,可以使用多个数据源来连接多个数据库。下面是一些步骤:1. 在application.properties或appl...
    99+
    2023-10-20
    spring 数据库
  • 如何在SpringBoot 中使用 Druid 数据库连接池
    目录1.Maven中的pom文件2.SpringBoot 配置文件3.配置Druid数据源实例4.过滤器和Servlet5.使用@ServletComponentScan注解,6.D...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作