关于Springboot-jpa多数据源的使用小结

目录

1. 多数据源使用的概述

2. 多数据源案例

2.1 数据库准备

 2.2 核心代码

2.3 目录结构

2.4 案例测试


1. 多数据源使用的概述

由于最近项目中需要用到多数据源,期间也遇到一些问题,所以以下作出一些总结分享。

常用的单数据源源码可以参考:springboot-jpa-demo(main分支)

以下源码会放在spring-jpa-multiple-datasources分支。

数据库使用的是postgres。

2. 多数据源案例

2.1 数据库准备

1) 当前有两个db分别是public和public2,都有一张userinfo表。

 2) public.userinfo数据。

 3) public2.userinfo数据。

 2.2 核心代码

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactory",
        transactionManagerRef = "pfTransactionManager",
        basePackages = {"com.bas.repository"}
)
@EntityScan(
        basePackages = {
                "com.bas.entity"
        }
)
public class DataSourceConfig {

    @Bean(name = "dataSource")
    @Primary
    @ConfigurationProperties(prefix = "spring.primary.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "entityManagerFactory")
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("dataSource") DataSource dataSource
    ){
        return builder.dataSource(dataSource)
                .packages("com.bas")
                .persistenceUnit("default")
                .build();
    }

    @Bean(name = "pfTransactionManager")
    @Primary
    public PlatformTransactionManager transactionManager(
            @Qualifier("entityManagerFactory")EntityManagerFactory entityManagerFactory
            ){
        return new JpaTransactionManager(entityManagerFactory);
    }

}

第二个数据源和以上的大相庭径,值得注意的是包路径和bean的名称不能重复。 

2.3 目录结构

2.4 案例测试

假设当前有俩接口分别是 /user/queryAll 和 /user/queryAll2 ,分别查询的是public.userinfo和public.userinfo2两张表的数据。

1) 查询public.userinfo。

 2) 查询public2.userinfo.

注:

1) 如果 application.properties 加上了 spring.jpa.properties.hibernate.default_schema,那么第二个数据源的 spring.secondary.datasource.jdbc-url=jdbc:postgresql://127.0.0.1:5432/postgres?currentSchema=public2 配置里面的currentSchema将会失效,这个时候需要在entity上加上

@Table(name="userinfo", schema = "public2")

所以为了避免每个entity都要加,建议是去掉default_schema这个配置。

2) 配置application.properties的时候要注意主数据源配置不能是原来的 spring.datasource.url 不然会导致jdbcUrl is required with driverClassName错误

1. 如果遇到:jdbcUrl is required with driverClassName,可以参考:spring boot 2.0 报错:“jdbcUrl is required with driverClassName.” 解决办法!

2. 如果遇到:different object with the same identifier value was already associated with the session,可以参考:解决a different object with the same identifier value was already associated with the session错误

3. 如果遇到数据更新有乐观锁的问题(Row was updated or deleted by another transaction),可以从数据库中把version查出来,赋给实体对象然后再更新。

4. 注意第一个数据源(com.bas)和第二个数据源(com.secondary)配置的package路径不能有重叠,否则第二个数据源加载不了的,如第二个数据源不能是com.bas.secondary。

5. 如果遇到IllegalArgumentException: Not a managed type: class com.secondary,检查数据源configuration里面的packages路径是否正确。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中配置JPA多数据源的方法如下: 1. 首先,在pom.xml文件中添加必要的依赖项,包括Spring Boot、JPA和数据库驱动程序。 2. 创建对应的数据源配置类,包括数据库连接信息、用户名、密码等。可以创建多个数据源配置类,每个数据源对应一个数据库。 3. 创建对应的JdbcTemplate实例,用于在代码中执行SQL语句。每个数据源都需要创建一个对应的JdbcTemplate对象。 4. 创建指定数据源的方法,用于在代码中动态切换数据源。可以使用@Primary注解指定默认的数据源。 5. 创建Jpa事务管理器,用于管理多个数据源的事务。每个数据源都需要创建一个对应的Jpa事务管理器。 6. 使用AOP的切面来切换数据源。可以使用@Before和@After注解来分别在方法执行前和执行后进行数据源的切换和恢复。 以上是配置JPA多数据源的一般步骤,根据具体需求和情况,可能还需要进行一些额外的配置和调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot-JPA多数据源](https://blog.csdn.net/zZZ251682553/article/details/125105388)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [springboot jpa 多数据源配置](https://blog.csdn.net/chenxing1990/article/details/122808525)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值