下面是“详解基于Spring Boot与Spring Data JPA的多数据源配置”的完整攻略。
背景介绍
在一些中大型应用系统中,常常会遇到多个数据源的问题。一个常见的场景是应用需要同时连接多个数据库,并且每个数据库又有自己的数据模型和对应的数据访问逻辑,这时我们就需要在应用中支持多数据源配置。
Spring Boot 为我们提供了很好的支持,可以很方便地配置多个数据源。
本文将介绍基于 Spring Boot 和 Spring Data JPA 的多数据源配置。
配置步骤
步骤一:在 pom.xml 中添加依赖
首先,在 pom.xml 中添加对 Spring Data JPA 和 Hibernate 的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</dependency>
需要注意的是,需要排除 Spring Boot 默认自带的 Hibernate 实体管理器,因为我们要自己配置多个数据源。
步骤二:配置 application.yml 文件
在 application.yml 文件中,配置多个数据源。
spring:
datasource:
primary:
url: jdbc:mysql://localhost:3306/primary_db?useSSL=false
username: primary_user
password: primary_password
secondary:
url: jdbc:mysql://localhost:3306/secondary_db?useSSL=false
username: secondary_user
password: secondary_password
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5Dialect
其中,primary 和 secondary 是数据源的名称,可以自己定义。在每个数据源下面配置数据库的连接信息,包括连接 URL、用户名和密码。
最后,配置 Hibernate 的方言和自动 DDL 生成策略。
步骤三:创建多数据源配置类
创建一个多数据源配置类,用来配置多个数据源。
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "primaryEntityManagerFactory",
transactionManagerRef = "primaryTransactionManager",
basePackages = {"com.example.primary.repository"})
public class PrimaryDataSourceConfig {
@Primary
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "primaryEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean
entityManagerFactory(
EntityManagerFactoryBuilder builder,
@Qualifier("primaryDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.primary.entity")
.persistenceUnit("primary")
.build();
}
@Primary
@Bean(name = "primaryTransactionManager")
public PlatformTransactionManager transactionManager(
@Qualifier("primaryEntityManagerFactory") EntityManagerFactory
entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
这个配置类中定义了一个名为 primary 的数据源。其中,@EnableJpaRepositories 注解中的 entityManagerFactoryRef 和 transactionManagerRef 分别指定了实体管理器工厂和事务管理器的名称。
@Bean 注解下的 dataSource 方法返回数据源对象,使用 @ConfigurationProperties(prefix = "spring.datasource.primary") 加载 application.yml 文件中的 primary 配置信息。
@Bean 注解下的 entityManagerFactory 方法创建实体管理器工厂对象,并将数据源和实体类所在的包路径关联起来。
@Bean 注解下的 transactionManager 方法创建事务管理器对象。
最后,再创建一个类似的 SecondaryDataSourceConfig 类,并修改其中的 primary 相关的内容,用于创建 secondary 数据源。
步骤四:测试多数据源配置
创建两个数据访问类,用于访问 primary 和 secondary 数据库中的数据。
@Repository
public class UserRepository {
@PersistenceContext(unitName = "primary")
private EntityManager entityManager;
public List<User> findAll() {
return entityManager.createQuery("FROM User").getResultList();
}
}
@Repository
public class ProductRepository {
@PersistenceContext(unitName = "secondary")
private EntityManager entityManager;
public List<Product> findAll() {
return entityManager.createQuery("FROM Product").getResultList();
}
}
其中,User 和 Product 分别是两个数据模型。通过 @PersistenceContext 注解指定需要使用的数据源。
创建一个测试类,用于测试访问多个数据源。
@RunWith(SpringRunner.class)
@SpringBootTest
public class MultiDataSourceTest {
@Autowired
private UserRepository userRepository;
@Autowired
private ProductRepository productRepository;
@Test
public void test() {
List<User> users = userRepository.findAll();
List<Product> products = productRepository.findAll();
System.out.println("Primary database users:");
users.forEach(System.out::println);
System.out.println("Secondary database products:");
products.forEach(System.out::println);
}
}
其中,通过 @Autowired 注解将 UserRepository 和 ProductRepository 注入到测试类中。
在测试方法中,分别从 primary 和 secondary 数据库中读取所有数据,并输出到控制台上。
示例一
我们假设有两个数据源,一个是 mysql 数据库,另一个是 oracle 数据库。mysql 数据库需要包含 user 表,oracle 数据库需要包含 product 表。
按照上述步骤,我们配置了两个数据源和多个数据访问类。然后,我们就可以分别从 mysql 和 oracle 数据库中读取数据了。
示例二
我们假设有一个应用系统,需要同时连接 mysql、postgresql 和 sql server 三个数据库,并且每个数据库有自己的业务数据和数据访问逻辑。
按照上述步骤,我们可以很方便地配置多个数据源,并访问多个数据库中的数据。
总结
本文详细介绍了基于 Spring Boot 和 Spring Data JPA 的多数据源配置。通过几个简单的步骤,我们可以配置多个数据源,并从不同的数据源中读取数据。
多数据源配置可以适用于很多应用场景,比如分库分表、数据迁移等。
希望本文对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解基于Spring Boot与Spring Data JPA的多数据源配置 - Python技术站