springboot多数据源配置

在Spring Boot中配置多个数据源需要完成以下步骤:

  1. 引入相关依赖

pom.xml文件中添加以下依赖:

<!-- Spring Boot JPA -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- Mysql Connector -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

<!-- HikariCP -->
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
</dependency>
  1. 配置多个数据源

application.yml中配置多个数据源的连接信息:

spring:
  datasource:
    primary:
      jdbc-url: jdbc:mysql://localhost:3306/primary?useSSL=false&serverTimezone=UTC
      username: root
      password: root
      driver-class-name: com.mysql.jdbc.Driver
    secondary:
      jdbc-url: jdbc:mysql://localhost:3306/secondary?useSSL=false&serverTimezone=UTC
      username: root
      password: root
      driver-class-name: com.mysql.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: none # 不自动创建表结构
    show-sql: true # 显示 SQL

上述配置中定义了两个数据源,一个是primary,一个是secondary。可以根据实际情况自行替换。

  1. 定义数据源实例

@Configuration注解标识的类中,定义两个数据源实例:

@Configuration
public class DataSourceConfig {

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

    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }
}

上述代码中,使用@Primary注解标识了primary数据源,当系统中存在多个数据源时,@Primary注解会将这个数据源优先注入到需要使用的地方。

  1. 创建EntityManagerFactory

@Configuration注解标识的类中,创建两个EntityManagerFactory实例:

@Configuration
@EnableJpaRepositories(
        entityManagerFactoryRef = "primaryEntityManagerFactory",
        transactionManagerRef = "primaryTransactionManager",
        basePackages = {"com.example.demo.primary.repository"})
public class PrimaryDataSourceConfig {

    @Bean(name = "primaryEntityManagerFactory")
    @Primary
    public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(
            EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource) {
        return builder.dataSource(dataSource).packages("com.example.demo.primary.entity")
                .persistenceUnit("primaryPersistenceUnit").build();
    }

    @Bean(name = "secondaryEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(
            EntityManagerFactoryBuilder builder, @Qualifier("secondaryDataSource") DataSource dataSource) {
        return builder.dataSource(dataSource).packages("com.example.demo.secondary.entity")
                .persistenceUnit("secondaryPersistenceUnit").build();
    }
}
创建TransactionManager
在@Configuration注解标识的类中,创建两个TransactionManager实例:

@Configuration
@EnableTransactionManagement
public class TransactionManagerConfig {

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

    @Bean(name = "secondaryTransactionManager")
    public PlatformTransactionManager secondaryTransactionManager(
            @Qualifier("secondaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}
使用数据源
在使用数据源时,需要使用@Qualifier注解指定使用哪个数据源:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    @Qualifier("primaryEntityManagerFactory")
    private EntityManagerFactory primaryEntityManagerFactory;

    @Autowired
    @Qualifier("secondaryEntityManagerFactory")
    private EntityManagerFactory secondaryEntityManagerFactory;

    @Transactional(transactionManager = "primaryTransactionManager")
    @Override
    public void addUser(User user) {
        EntityManager entityManager = primaryEntityManagerFactory.createEntityManager();
        entityManager.getTransaction().begin();
        entityManager.persist(user);
        entityManager.getTransaction().commit();
        entityManager.close();
    }

    @Transactional(transactionManager = "secondaryTransactionManager")
    @Override
    public void updateUser(User user) {
        EntityManager entityManager = secondaryEntityManagerFactory.createEntityManager();
        entityManager.getTransaction().begin();
        entityManager.merge(user);
        entityManager.getTransaction().commit();
        entityManager.close();
    }
}
上述代码中,@Transactional注解中的transactionManager属性指定了具体使用的TransactionManager。同时,在获取EntityManagerFactory实例时,需要使用@Qualifier注解指定具体的数据源。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程界的小子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值