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

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

项目依赖

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

com.oracle

ojdbc6

11.2.0.3.0

compile

mysql

mysql-connector-java

org.springframework.boot

spring-boot-starter-data-jpa

javax.persistence

javax.persistence-api

2.2

org.projectlombok

lombok

1.18.12

包管理

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

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

数据库连接配置

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

## jdbc-primary

spring.datasource.url=jdbc:mysql://localhost:33306/springboot?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false

spring.datasource.username=springboot

spring.datasource.password=123456spring.ds_mysql.driverClassName=com.mysql.jdbc.Driver

## jdbc-second

spring.second.datasource.url=jdbc:oracle:thin:@localhost:1909/xxx.xxx.com

spring.second.datasource.userName=springboot

spring.second.datasource.password=123456spring.second.datasource.driver-class-name=oracle.jdbc.OracleDriver

## jpa

spring.jpa.hibernate.ddl-auto=none

spring.jpa.show-sql=truespring.jpa.properties.hibernate.jdbc.time_zone=UTC

spring.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")publicDataSourceProperties dataSourceProperties() {return newDataSourceProperties();

}

@Primary

@Bean(name= "mysqlDataSource")

@ConfigurationProperties("spring.datasource.configuration")public DataSource dataSource (@Qualifier("mysqlDataSourceProperties") DataSourceProperties mysqlDataSourceProperties) {returnmysqlDataSourceProperties.initializeDataSourceBuilder()

.type(HikariDataSource.class)

.build();

}

Secondary Data Source

@Bean(name = "oracleDataSourceProperties")

@ConfigurationProperties("spring.second.datasource")publicDataSourceProperties dataSourceProperties() {return newDataSourceProperties();

}

@Bean

@ConfigurationProperties("spring.second.datasource.configuration")public DataSource oracleDataSource(@Qualifier("oracleDataSourceProperties") DataSourceProperties oracleDataSourceProperties) {returnoracleDataSourceProperties.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")publicLocalContainerEntityManagerFactoryBean entityManagerFactory(

EntityManagerFactoryBuilder builder, @Qualifier("mysqlDataSource") DataSource mysqlDataSource) {returnbuilder.dataSource(mysqlDataSource)

.packages("com.example.demo.model.mysql")

.persistenceUnit("mysql")

.build();

}

Secondary Entity Manager Factory

@Bean(name = "oracleEntityManagerFactory")publicLocalContainerEntityManagerFactoryBean oracleEntityManagerFactory(

EntityManagerFactoryBuilder builder, @Qualifier("oracleDataSource") DataSource oracleDataSource) {returnbuilder.dataSource(oracleDataSource)

.packages("com.example.demo.model.oracle")

.persistenceUnit("oracle")

.build();

}

我们使用@Qualifie注解,自动将DataSource关联到对应的EntityManangerFactory中。

在这里我们可以分别配置实体类管理工厂所管理的packages,为了方便开发和阅读,分别将mysql和oracle关联的实体类放在对应的目录下。

事务管理

我们为每个数据库创建一个JPA事务管理器。

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

源码:

publicJpaTransactionManager(EntityManagerFactory emf) {this();this.entityManagerFactory =emf;this.afterPropertiesSet();

}

Primary transaction manager

@Primary

@Bean(name= "mysqlTransactionManager")public PlatformTransactionManager mysqlTransactionManager(final @Qualifier("mysqlEntityManagerFactory")

LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory) {return newJpaTransactionManager(mysqlEntityManagerFactory.getObject());

}

Secondary transaction manager

@Bean(name = "oracleTransactionManager")publicPlatformTransactionManager oracleTransactionManager(final @Qualifier("oracleEntityManagerFactory")

LocalContainerEntityManagerFactoryBean oracleEntityManagerFactory) {return newJpaTransactionManager(oracleEntityManagerFactory.getObject());

}

JPA Repository配置

由于我们使用了两个不同的数据源,所以我们必须使用@EnableJpaRepositories注解为每个数据源提供特定的信息。

进入该注解源码,我们可以发现默认值如下:

/*** Annotation to enable JPA repositories. Will scan the package of the annotated configuration class for Spring Data

* repositories by default.

*

*@authorOliver Gierke

*@authorThomas Darimont*/@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@Import(JpaRepositoriesRegistrar.class)public @interfaceEnableJpaRepositories {/*** Base packages to scan for annotated components. {@link#value()} is an alias for (and mutually exclusive with) this

* attribute. Use {@link#basePackageClasses()} for a type-safe alternative to String-based package names.*/String[] basePackages()default{};/*** Configures the name of the {@linkEntityManagerFactory} bean definition to be used to create repositories

* discovered through this annotation. Defaults to {@codeentityManagerFactory}.

*

*@return

*/String entityManagerFactoryRef()default "entityManagerFactory";/*** Configures the name of the {@linkPlatformTransactionManager} bean definition to be used to create repositories

* discovered through this annotation. Defaults to {@codetransactionManager}.

*

*@return

*/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 classMysqlDataSourceConfiguration {

...

}

secondary

@Configuration

@EnableTransactionManagement

@EnableJpaRepositories(basePackages= "com.example.demo.repository.oracle",

entityManagerFactoryRef= "oracleEntityManagerFactory", transactionManagerRef = "oracleTransactionManager")public classOracleDataSourceConfiguration {

...

}

完整的配置文件

primary

@Configuration

@EnableTransactionManagement

@EnableJpaRepositories(basePackages= {"com.example.demo.repository.mysql"},

entityManagerFactoryRef= "mysqlEntityManagerFactory", transactionManagerRef = "mysqlTransactionManager")public classMysqlDataSourceConfiguration {

@Primary

@Bean(name= "mysqlDataSourceProperties")

@ConfigurationProperties("spring.datasource")publicDataSourceProperties dataSourceProperties() {return newDataSourceProperties();

}

@Primary

@Bean(name= "mysqlDataSource")

@ConfigurationProperties("spring.datasource.configuration")public DataSource dataSource (@Qualifier("mysqlDataSourceProperties") DataSourceProperties mysqlDataSourceProperties) {returnmysqlDataSourceProperties.initializeDataSourceBuilder()

.type(HikariDataSource.class)

.build();

}

@Primary

@Bean(name= "mysqlEntityManagerFactory")publicLocalContainerEntityManagerFactoryBean entityManagerFactory(

EntityManagerFactoryBuilder builder, @Qualifier("mysqlDataSource") DataSource mysqlDataSource) {returnbuilder.dataSource(mysqlDataSource)

.packages("com.example.demo.model.mysql")

.persistenceUnit("mysql")

.build();

}

@Primary

@Bean(name= "mysqlTransactionManager")public PlatformTransactionManager transactionManager(final @Qualifier("mysqlEntityManagerFactory")

LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory) {return newJpaTransactionManager(mysqlEntityManagerFactory.getObject());

}

}

secondary

@Configuration

@EnableTransactionManagement

@EnableJpaRepositories(basePackages= "com.example.demo.repository.oracle",

entityManagerFactoryRef= "oracleEntityManagerFactory", transactionManagerRef = "oracleTransactionManager")public classOracleDataSourceConfiguration {

@Bean(name= "oracleDataSourceProperties")

@ConfigurationProperties("spring.second.datasource")publicDataSourceProperties dataSourceProperties() {return newDataSourceProperties();

}

@Bean

@ConfigurationProperties("spring.second.datasource.configuration")public DataSource oracleDataSource(@Qualifier("oracleDataSourceProperties") DataSourceProperties oracleDataSourceProperties) {returnoracleDataSourceProperties.initializeDataSourceBuilder()

.type(HikariDataSource.class)

.build();

}

@Bean(name= "oracleEntityManagerFactory")publicLocalContainerEntityManagerFactoryBean oracleEntityManagerFactory(

EntityManagerFactoryBuilder builder, @Qualifier("oracleDataSource") DataSource oracleDataSource) {returnbuilder.dataSource(oracleDataSource)

.packages("com.example.demo.model.oracle")

.persistenceUnit("oracle")

.build();

}

@BeanpublicPlatformTransactionManager oracleTransactionManager(final @Qualifier("oracleEntityManagerFactory")

LocalContainerEntityManagerFactoryBean oracleEntityManagerFactory) {return newJpaTransactionManager(oracleEntityManagerFactory.getObject());

}

}

总结

当仅有一个数据源时,Spring Boot会默认自动配置好,但是如果使用多个数据源时,需要进行一些自定义的配置,以上便是全部的配置。

总体感觉并不是特别复杂,耐心理解下,还是很容易理解的。

如有错漏之处,还望各位大佬们指正。

作者:吴家二少

本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接

mysql 配置多个数据库连接_SpringBoot多数据库连接(mysql+oracle)相关推荐

  1. win7 apache php mysql 配置64,win7 64位 Apache+php+mysql配置方法

    这两天一直在学习网站前端后台的制作,给电脑配置Apache php MySQL时遇到了不少问题,今天终于把它解决了,这里分享下自己安装过程以及配置过程中遇到的问题. 安装用的几个软件已上传到自己的空间 ...

  2. redmine mysql配置_Redmine安装指南一:railsinstaller+apache+mysql(推荐)

    安装方法一:railsinstaller+apache+mysql 搜索redmine安装的时候,排名最前配置ruby环境的软件就是InstantRails.可实际上InstantRails从2007 ...

  3. redhat 9.0 mysql 配置_RedHat 9.0下Apache+PHP+MySQL服务器安装配置

    一.安装环境 操作系统:Linux RedHat 9.0 web服务软件:Apache httpd-2.2.3.tar.gz 数据库软件:MySQL-server-5.0.26-0.i386.rpm( ...

  4. mysql 配置vip_数据库学习之十三:mysql高可用配置

    十三.mysql高可用 1.普通主从复制架构存在的不足 高可用? 业务不间断的工作. 用户的体验不出来业务断点. 普通主从环境,存在的问题: 1.监控的问题:APP应用程序,并不具备监控数据库的功能, ...

  5. java mysql 配置_Java连接MySQL数据库详细分析

    一:工具 eclipse MySQL5.7 MySQL连接驱动:mysql-connector-java-5.1.44-bin.jar下载地址 二:加载驱动 2.1 在工程目录中创建lib文件夹,将下 ...

  6. 这些MySQL配置“修改条令”,你有必要熟识默记!

    大多数开发者可能不太会关注MySQL的配置,毕竟在基本配置没有问题的情况下,把更多的精力放在schema设计.索引优化和SQL优化上,是非常务实的策略.这时,如果再花力气去优化配置项,获得的收益通常都 ...

  7. nhibernate访问mysql配置_NHibernate各种数据库连接参数文件配置方法说明

    /NHibernate各种数据库连接参数文件配置方法说明 //配置文件Config/Hibernate.cfg.xml内容如下所示: NHibernate.Driver.SqlClientDriver ...

  8. nhibernate mysql配置_NHibernate各种数据库连接参数文件配置方法说明

    //配置文件Config/Hibernate.cfg.xml内容如下所示: NHibernate.Driver.SqlClientDriver NHibernate.Dialect.MsSql2008 ...

  9. python实现数据库连接池_Python实现Mysql数据库连接池

    Python实现Mysql数据库连接池 python连接Mysql数据库: python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时,都 ...

最新文章

  1. 使用KNN模型进行多输出分类实战(Multioutput Classification)
  2. esxi ntp服务器地址_NTP的工作原理以及工作模式
  3. C#.net Winform获取文件路径
  4. SystemCenter2012SP1实践(27)VMM和HyperV的PowerShell
  5. antd源码解读(4)- ButtonGroup
  6. 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考
  7. RecursiveTask和RecursiveAction的使用 以及java 8 并行流和顺序流
  8. oracle中substrb用法,oracle中substr和instr的用法
  9. 失败,因为你其实太过傲慢
  10. Web前端新手必看的7种技术,从菜鸟到高级开发的蜕变!
  11. aspx怎么转成java,Asp.net 2.0 中.aspx请求,即如何生成响应的Html文件(原创)
  12. 汉语中的通用量词:个,块
  13. 博科光纤交换机配置及管理 CLI篇
  14. 用户标签的集合——用户画像及其应用
  15. php控制表格颜色,php – 表格列的背景颜色
  16. IETester更新至最新版已经兼容Windows7(附下载地址及Debugbar插件)
  17. 微软个人云端服务器在哪里找,云端的服务器在哪里
  18. 《AngularJS深度剖析与最佳实践》一2.10 承诺
  19. [云开发3]-将问卷调查Demo应用快速部署到SAP云平台
  20. 基于Pytorch的cifar10分类网络模型

热门文章

  1. UI素材模板|数据可视化APP界面
  2. python爬取小说基本信息_Python爬虫零基础实例---爬取小说吧小说内容到本地
  3. mysql按首数字分表_MySql基础-数据分表
  4. C++ Web 编程 CGI公共网关接口(CGI):第一个 CGI 程序
  5. python八角图形绘制_(Python)从零开始,简单快速学机器仿人视觉Opencv—第四节:OpenCV处理鼠标事件...
  6. ssms安装_SQLServer 2019下载及安装教程
  7. python 列表为空_如果列表为空,则Python返回False
  8. linux下代码写错了怎么更改_linux系统下poll和epoll内核源代码剖析
  9. Yarn的资源调度与隔离
  10. nodejs的事件处理机制