Spring Boot JPA多数据源配置及应用

深海里的光 2024-06-23 ⋅ 17 阅读

引言

在开发中,我们经常会遇到需要同时连接多个数据库的情况。Spring Boot框架与JPA(Java Persistence API)结合使用,可以简化与数据库的交互操作。本文将介绍如何使用Spring Boot JPA连接多个数据源,并进行简单的应用。

1. 创建Spring Boot项目

首先,我们需要创建一个Spring Boot项目。可以使用Spring Initializer进行初始化,也可以手动创建一个空的Maven项目,并在pom.xml中添加相应的依赖。

2. 配置多数据源

在Spring Boot中,配置多数据源需要使用到@Configuration注解和@Bean注解。首先,在项目的配置文件(application.properties或application.yml)中添加多个数据源的相关配置信息,如下所示:

# 第一个数据源
spring.datasource.url=jdbc:mysql://localhost:3306/db1
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driverClassName=com.mysql.jdbc.Driver

# 第二个数据源
datasource2.url=jdbc:mysql://localhost:3306/db2
datasource2.username=root
datasource2.password=123456
datasource2.driverClassName=com.mysql.jdbc.Driver

然后,创建两个配置类分别配置两个数据源,如下所示:

@Configuration
@EnableJpaRepositories(basePackages = "com.example.repository.datasource1", entityManagerFactoryRef = "dataSource1EntityManagerFactory")
public class DataSource1Config {

    @Autowired
    private Environment env;

    @Bean
    @Primary
    public DataSource dataSource1() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("spring.datasource.driverClassName"));
        dataSource.setUrl(env.getProperty("spring.datasource.url"));
        dataSource.setUsername(env.getProperty("spring.datasource.username"));
        dataSource.setPassword(env.getProperty("spring.datasource.password"));
        return dataSource;
    }

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean dataSource1EntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(dataSource1())
                .packages("com.example.model.datasource1")
                .build();
    }

    // 其它Bean的配置...
}

@Configuration
@EnableJpaRepositories(basePackages = "com.example.repository.datasource2", entityManagerFactoryRef = "dataSource2EntityManagerFactory")
public class DataSource2Config {

    @Autowired
    private Environment env;

    @Bean
    public DataSource dataSource2() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("datasource2.driverClassName"));
        dataSource.setUrl(env.getProperty("datasource2.url"));
        dataSource.setUsername(env.getProperty("datasource2.username"));
        dataSource.setPassword(env.getProperty("datasource2.password"));
        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean dataSource2EntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(dataSource2())
                .packages("com.example.model.datasource2")
                .build();
    }

    // 其它Bean的配置...
}

在以上代码中,@EnableJpaRepositories注解用于启用JPA仓库并指定basePackages为Entity类所在的包路径。@Bean注解用于声明一个Bean,@Autowired注解用于自动装配Environment对象,通过它可以获取配置文件中的属性值。

3. 使用多数据源

要使用多数据源,我们需要在具体的Service或Repository类中指定使用哪个数据源。使用@Qualifier注解配合EntityManagerEntityManagerFactory注入指定的数据源,如下所示:

@Service
public class UserService {

    @PersistenceContext(unitName = "dataSource1EntityManagerFactory")
    private EntityManager em1;
    
    @PersistenceContext(unitName = "dataSource2EntityManagerFactory")
    private EntityManager em2;

    // 其它代码...
}

在以上代码中,@PersistenceContext注解用于指定要使用的数据源。unitName属性的值对应于配置类中@Bean方法的名称,即dataSource1EntityManagerFactorydataSource2EntityManagerFactory

结语

通过以上步骤,我们成功配置了Spring Boot JPA的多数据源,使得我们的应用可以同时连接多个数据库,并进行数据操作。这将极大地方便我们处理一些需要跨数据库的业务场景。希望本文对你有所帮助,谢谢阅读!

参考资料

  1. Spring Boot官方文档: https://spring.io/projects/spring-boot
  2. JPA官方文档: https://docs.oracle.com/javaee/6/tutorial/doc/bnbpz.html

全部评论: 0

    我有话说: