使用Spring Boot和JPA配置多数据源
引言
在现代的企业应用中,经常需要同时连接多个数据库。这可能是因为应用需要访问不同的数据库,或者是为了分离读写操作,提高性能。Spring Boot作为一种流行的Java开发框架,提供了简便的方式来配置和管理多个数据源。本文将详细介绍如何在Spring Boot项目中配置多数据源。
1. 添加依赖
首先,在你的Spring Boot项目中,需要添加相应的依赖来支持多数据源配置。通常,我们会使用Spring Data JPA来访问数据库,所以需要添加以下依赖:
<dependencies>
<!-- 其他依赖... -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
如果你使用其他数据库,比如MyBatis,可以根据实际情况添加相应的依赖。
2. 配置数据源
在application.properties
(或application.yml
)文件中,配置多个数据源的连接信息。例如:
# 数据源1
spring.datasource.datasource1.url=jdbc:mysql://localhost:3306/db1
spring.datasource.datasource1.username=user1
spring.datasource.datasource1.password=password1
spring.datasource.datasource1.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据源2
spring.datasource.datasource2.url=jdbc:mysql://localhost:3306/db2
spring.datasource.datasource2.username=user2
spring.datasource.datasource2.password=password2
spring.datasource.datasource2.driver-class-name=com.mysql.cj.jdbc.Driver
这里我们配置了两个数据源,分别是datasource1
和datasource2
。你可以根据实际情况配置更多的数据源。
3. 创建数据源配置类
为了将配置信息转化为数据源对象,我们需要创建对应的Java配置类。在config
包下创建一个名为DataSourceConfig
的类:
@Configuration
@EnableTransactionManagement
public class DataSourceConfig {
@Primary
@Bean(name = "dataSource1")
@ConfigurationProperties(prefix = "spring.datasource.datasource1")
public DataSource dataSource1() {
return DataSourceBuilder.create().build();
}
@Bean(name = "dataSource2")
@ConfigurationProperties(prefix = "spring.datasource.datasource2")
public DataSource dataSource2() {
return DataSourceBuilder.create().build();
}
}
在这里,我们使用@Configuration
注解表明这是一个配置类,@EnableTransactionManagement
用于启用注解事务管理。@Primary
注解表示默认使用dataSource1
作为主数据源。
4. 创建JPA配置类
如果你使用Spring Data JPA,还需要创建一个JPA配置类。在config
包下创建一个名为JpaConfig
的类:
@Configuration
@EnableJpaRepositories(
basePackages = "com.example.repository1",
entityManagerFactoryRef = "entityManagerFactory1",
transactionManagerRef = "transactionManager1"
)
public class JpaConfig {
@Primary
@Bean(name = "entityManagerFactory1")
public LocalContainerEntityManagerFactoryBean entityManagerFactory1(
EntityManagerFactoryBuilder builder,
@Qualifier("dataSource1") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.model1")
.persistenceUnit("db1")
.build();
}
@Primary
@Bean(name = "transactionManager1")
public PlatformTransactionManager transactionManager1(
@Qualifier("entityManagerFactory1") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
在这里,我们使用@EnableJpaRepositories
注解指定了JPA仓库的位置。entityManagerFactory1
和transactionManager1
分别用于配置第一个数据源的实体管理工厂和事务管理器。
5. 创建第二个数据源的JPA配置类
如果有第二个数据源,需要创建类似的JPA配置类。在config
包下创建一个名为JpaConfig2
的类:
@Configuration
@EnableJpaRepositories(
basePackages = "com.example.repository2",
entityManagerFactoryRef = "entityManagerFactory2",
transactionManagerRef = "transactionManager2"
)
public class JpaConfig2 {
@Bean(name = "entityManagerFactory2")
public LocalContainerEntityManagerFactoryBean entityManagerFactory2(
EntityManagerFactoryBuilder builder,
@Qualifier("dataSource2") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.model2")
.persistenceUnit("db2")
.build();
}
@Bean(name = "transactionManager2")
public PlatformTransactionManager transactionManager2(
@Qualifier("entityManagerFactory2") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
这里需要注意的是,basePackages
应该指定第二个数据源的JPA仓库包路径,entityManagerFactory2
和transactionManager2
用于配置第二个数据源的实体管理工厂和事务管理器。
6. 创建实体类和Repository
在com.example.model1
和com.example.repository1
包下分别创建第一个数据源的实体类和JPA仓库接口。同样,在com.example.model2
和com.example.repository2
包下创建第二个数据源的实体类和JPA仓库接口。
7. 使用多数据源
现在,你可以在服务类中使用多个数据源了。在需要使用第一个数据源的地方,使用@Qualifier("dataSource1")
注解注入EntityManager
,例如:
@Service
public class MyService {
@PersistenceContext(unitName = "db1")
@Qualifier("entityManagerFactory1")
private EntityManager entityManager1;
// 其他服务代码...
}
同样,在需要使用第二个数据源的地方,使用@Qualifier("dataSource2")
注解注入EntityManager
。
8. 测试
最后,编写单元测试来确保多数据源配置正常工作。你可以使用Spring Boot提供的@DataJpaTest
注解来简化测试。
@DataJpaTest
class MultipleDataSourceTest {
@Autowired
private MyRepository1 myRepository1;
@Autowired
private MyRepository2 myRepository2;
// 测试代码...
}
结论
通过以上步骤,你已经成功配置了Spring Boot项目中的多数据源。这样,你可以在应用中使用不同的数据库,并根据需求分离读写操作,提高性能。
希望这篇文章对你理解和配置Spring Boot多数据源有所帮助。如果有任何问题或建议,请随时提出。谢谢阅读!
评论区