Spring Boot、具有多个数据源的 Spring Data JPA

作者:编程家 分类: spring 时间:2025-12-10

Spring Boot与多数据源的Spring Data JPA

在开发Web应用程序时,数据持久化是一个非常重要的部分。Spring Boot是一个开发框架,可以帮助我们快速构建基于Java的应用程序。而Spring Data JPA是Spring框架中的一个模块,它提供了对关系型数据库的访问和操作。

在某些情况下,我们可能需要同时连接多个数据源。比如,我们的应用程序可能需要连接到不同的数据库,或者连接到主数据库和副本数据库等。Spring Boot和Spring Data JPA提供了一种灵活的方式来处理多数据源的情况。

配置多数据源

要使用多数据源,我们首先需要在Spring Boot的配置文件中配置数据源。我们可以使用`spring.datasource`前缀来配置主数据源,而使用`datasource.secondary`前缀来配置其他数据源。

spring.datasource.url=jdbc:mysql://localhost:3306/main_database

spring.datasource.username=root

spring.datasource.password=123456

datasource.secondary.url=jdbc:mysql://localhost:3306/secondary_database

datasource.secondary.username=root

datasource.secondary.password=123456

在配置文件中,我们可以指定不同数据源的连接URL、用户名和密码等信息。

创建数据源配置类

接下来,我们需要创建数据源配置类来为每个数据源定义一个`DataSource` bean。我们可以使用`@Configuration`注解将该类标记为配置类,使用`@Primary`注解来标记主数据源。

java

@Configuration

public class DataSourceConfig {

@Primary

@Bean

@ConfigurationProperties(prefix = "spring.datasource")

public DataSource primaryDataSource() {

return DataSourceBuilder.create().build();

}

@Bean

@ConfigurationProperties(prefix = "datasource.secondary")

public DataSource secondaryDataSource() {

return DataSourceBuilder.create().build();

}

}

在配置类中,我们使用`@Bean`注解来创建`DataSource` bean,并使用`@ConfigurationProperties`注解来绑定配置文件中的属性。

配置JPA

接下来,我们需要配置JPA。我们可以使用`@EnableJpaRepositories`注解来启用JPA仓库,并使用`entityManagerFactoryRef`属性来指定每个数据源的`EntityManagerFactory` bean。

java

@Configuration

@EnableJpaRepositories(

basePackages = "com.example.repository.main",

entityManagerFactoryRef = "mainEntityManagerFactory",

transactionManagerRef = "mainTransactionManager"

)

public class MainJpaConfig {

@Autowired

@Qualifier("primaryDataSource")

private DataSource primaryDataSource;

@Primary

@Bean

public LocalContainerEntityManagerFactoryBean mainEntityManagerFactory(EntityManagerFactoryBuilder builder) {

return builder

.dataSource(primaryDataSource)

.packages("com.example.entity.main")

.persistenceUnit("main")

.build();

}

@Primary

@Bean

public PlatformTransactionManager mainTransactionManager(@Qualifier("mainEntityManagerFactory") EntityManagerFactory entityManagerFactory){

return new JpaTransactionManager(entityManagerFactory);

}

}

在这个配置类中,我们使用`@EnableJpaRepositories`注解指定了JPA仓库的基础包路径,以及`EntityManagerFactory`和事务管理器的引用。

使用多数据源

现在,我们已经配置好了多个数据源和JPA。接下来,我们可以在代码中使用这些数据源了。

java

@Repository

public interface UserRepository extends JpaRepository {

@Query(value = "SELECT * FROM users", nativeQuery = true)

List getAllUsers();

}

@Service

public class UserService {

@Autowired

private UserRepository userRepository;

@Autowired

@Qualifier("secondaryDataSource")

private DataSource secondaryDataSource;

public List getAllUsers() {

// 使用主数据源进行查询

return userRepository.findAll();

}

public List getAllUsersFromSecondaryDataSource() {

// 切换到副本数据源进行查询

JdbcTemplate jdbcTemplate = new JdbcTemplate(secondaryDataSource);

return jdbcTemplate.query("SELECT * FROM users", (resultSet, rowNum) ->

new User(resultSet.getLong("id"), resultSet.getString("name")));

}

}

在这个例子中,我们定义了一个`UserRepository`接口来访问数据库中的用户表。在`UserService`中,我们使用`@Autowired`注解来注入`UserRepository`和副本数据源。

通过使用Spring Boot和Spring Data JPA,我们可以轻松地配置和使用多个数据源。我们只需要在配置文件中定义数据源的连接信息,并创建相应的配置类即可。然后,我们可以在代码中使用`@Qualifier`注解来指定要使用的数据源。这使得我们能够更灵活地处理多数据源的情况,提高应用程序的性能和可扩展性。