场景假设:现有电商业务,商品和库存分别放在不同的库

配置数据库连接

app:
datasource: first:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1/product?useSSL=false
username: root
password: root
configuration:
maximum-pool-size: 10 second:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1/stock?useSSL=false
username: root
password: root
configuration:
maximum-pool-size: 10

添加配置类

FirstConfig

@Configuration
@EnableJpaRepositories(
basePackages = {"com.karonda.springboot2datasourcesjpa.dao.first"},// 1. dao 层所在的包
entityManagerFactoryRef = "firstEntityManagerFactory",
transactionManagerRef = "firstTransactionManager")
@EnableTransactionManagement
public class FirstConfig { @Bean
@Primary
public PlatformTransactionManager firstTransactionManager() {
return new JpaTransactionManager(firstEntityManagerFactory().getObject());
} @Bean
@Primary
public LocalContainerEntityManagerFactoryBean firstEntityManagerFactory() { HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(firstDataSource());
factoryBean.setJpaVendorAdapter(jpaVendorAdapter);
factoryBean.setJpaProperties(hibernateProperties()); factoryBean.setPackagesToScan("com.karonda.springboot2datasourcesjpa.entity.first");// 2. 实体类所在的包 return factoryBean;
} @Bean
@Primary
@ConfigurationProperties("app.datasource.first")
public DataSourceProperties firstDataSourceProperties() {
return new DataSourceProperties();
} @Bean
@Primary
@ConfigurationProperties("app.datasource.first.configuration")
public DataSource firstDataSource() {
return firstDataSourceProperties()
.initializeDataSourceBuilder()
.type(HikariDataSource.class) // 3. 可以显示指定连接池,也可以不显示指定;即此行代码可以注释掉
.build();
} private Properties hibernateProperties() {
final Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
// hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "create");
return hibernateProperties;
} }

SecondConfig

@Configuration
@EnableJpaRepositories(
basePackages = {"com.karonda.springboot2datasourcesjpa.dao.second"},
entityManagerFactoryRef = "secondEntityManagerFactory",
transactionManagerRef = "secondTransactionManager")
@EnableTransactionManagement
public class SecondConfig { @Bean
public PlatformTransactionManager secondTransactionManager() {
return new JpaTransactionManager(secondEntityManagerFactory().getObject());
} @Bean
public LocalContainerEntityManagerFactoryBean secondEntityManagerFactory() { HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(secondDataSource());
factoryBean.setJpaVendorAdapter(jpaVendorAdapter);
factoryBean.setJpaProperties(hibernateProperties()); factoryBean.setPackagesToScan("com.karonda.springboot2datasourcesjpa.entity.second"); return factoryBean;
} @Bean
@ConfigurationProperties("app.datasource.second")
public DataSourceProperties secondDataSourceProperties() {
return new DataSourceProperties();
} @Bean
@ConfigurationProperties("app.datasource.second.configuration")
public DataSource secondDataSource() {
return secondDataSourceProperties()
.initializeDataSourceBuilder()
.type(HikariDataSource.class)
.build();
} private Properties hibernateProperties() {
final Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
// hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "create");
return hibernateProperties;
} }

dao

public interface ProductDao extends JpaRepository<Product, Integer> {

    @Query(value = "select p from Product p where p.id = id")
Product findById(@Param("id") int id);
}
public interface StockDao extends JpaRepository<Stock, Integer> {

    @Query(value = "select s from Stock s where s.productId = productId")
Stock findByProductId(@Param("productId") int productId);
}

使用示例

@Component
public class Task { @Autowired
private ProductDao productDao;
@Autowired
private StockDao stockDao; @Scheduled(cron = "0/5 * * * * ? ")
public void job(){ final int productId = 1;
Product product = productDao.findById(productId);
Stock stock = stockDao.findByProductId(productId); System.out.println("产品名称: " + product.getName() + ", 库存: " + stock.getStockCount());
} }

注意事项

  1. 使用多数据源,其中一个配置类需要添加 @Primary 注解 (有且仅有一个配置类需要添加)
  2. 在配置类中需要同时配置 dao 层和实体类所在的包

参考:

完整代码:GitHub

本人 C# 转 Java 的 newbie, 如有错误或不足欢迎指正,谢谢

Spring Boot 2.x 多数据源配置之 JPA 篇的更多相关文章

  1. Spring Boot 2.x 多数据源配置之 MyBatis 篇

    场景假设:现有电商业务,商品和库存分别放在不同的库 配置数据库连接 app: datasource: first: driver-class-name: com.mysql.cj.jdbc.Drive ...

  2. 13、Spring Boot 2.x 多数据源配置

    1.13 Spring Boot 2.x 多数据源配置 完整源码: Spring-Boot-Demos

  3. Spring Boot之JdbcTemplate多数据源配置与使用

    之前在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源.在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.propertie ...

  4. spring boot +mybatis+druid 多数据源配置

    因为我的工程需要在两个数据库中操作数据,所以要配置两个数据库,我这里没有数据源没有什么主从之分,只是配合多数据源必须要指定一个主数据源,所以我就把 操作相对要对的那个数据库设置为主数据(dataBas ...

  5. Spring Boot 两种多数据源配置:JdbcTemplate、Spring-data-jpa

    多数据源配置 JdbcTemplate支持 Spring-data-jpa支持 多数据源配置 创建一个Spring配置类,定义两个DataSource用来读取application.propertie ...

  6. Spring Boot2 系列教程(二十)Spring Boot 整合JdbcTemplate 多数据源

    多数据源配置也算是一个常见的开发需求,Spring 和 SpringBoot 中,对此都有相应的解决方案,不过一般来说,如果有多数据源的需求,我还是建议首选分布式数据库中间件 MyCat 去解决相关问 ...

  7. Spring Boot应用的后台运行配置

    酱油一篇,整理一下关于Spring Boot后台运行的一些配置方式.在介绍后台运行配置之前,我们先回顾一下Spring Boot应用的几种运行方式: 运行Spring Boot的应用主类 使用Mave ...

  8. Spring boot 的 properties 属性值配置 application.properties 与 自定义properties

    配置属性值application.properties 文件直接配置: com.ieen.super.name="MDD" 自定义properties文件配置:src/main/r ...

  9. Spring Boot 启动(二) 配置详解

    Spring Boot 启动(二) 配置详解 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring Boot 配置 ...

随机推荐

  1. [POJ 2821]TN's Kindom III(任意长度循环卷积的Bluestein算法)

    [POJ 2821]TN's Kindom III(任意长度循环卷积的Bluestein算法) 题面 给出两个长度为\(n\)的序列\(B,C\),已知\(A\)和\(B\)的循环卷积为\(C\),求 ...

  2. element UI table show-overflow-tooltip属性更改背景色和字体颜色

    .el-tooltip__popper { width: 80%;/*修改宽度*/ background: #000 !important;/*背景色  !important优先级*/ opacity ...

  3. leetcode117:search-rotated-sorted-array

    题目描述 给出一个转动过的有序数组,你事先不知道该数组转动了多少 (例如,0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2). 在数组中搜索给出的目标值,如果能在数组中找到,返回它的索引, ...

  4. Spring笔记(7) - Spring的事件和监听机制

    一.背景 事件机制作为一种编程机制,在很多开发语言中都提供了支持,同时许多开源框架的设计中都使用了事件机制,比如SpringFramework. 在 Java 语言中,Java 的事件机制参与者有3种 ...

  5. 对于STM32F103的USART的通讯调试

    USART:(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步串行接收/发送器USART是一个全双工通用同步/异步串行收发 ...

  6. 自定义泛型方法, 三级排序, low版,待升级

    package com.jd.dashboard.util; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken ...

  7. ESP32的Linux开发环境搭建

    1. 官网教程地址 https://docs.espressif.com/projects/esp-idf/zh_CN/v4.0.1/get-started/linux-setup.html 2.官网 ...

  8. golang的bytes.buffer

    参考原文:go语言的bytes.buffer 一.创建缓冲期 bytes.buffer是一个缓冲byte类型的缓冲器 1.使用bytes.NewBuffer创建:参数是[]byte的话,缓冲器里就是这 ...

  9. Linux_end

    1.ps 查看进程 ps 查看进程 ps aux 查看所有进程 ps -ef 查看所有进程的详细信息 2.pstree 查看进程树 3.top 查看系统的健康状况 4.netstar 显示网络统计信息 ...

  10. tar命令打包和压缩与解压

    Linux里压缩与打包时分开的: 打包:多个文件变一个文件.该一个文件会大于整体所有文件,因为会添加各个信息说明哪到哪是一个文件. 压缩:大文件变小文件. 归档:将多个文件变成一个文件,这个文件就是归 ...