1. 引言
在许多现代应用中,数据存储和管理往往需要使用多个数据库,每个数据库可能有不同的访问权限、数据结构或者用途。Spring Boot提供了强大的支持来配置和管理多个数据源,使得开发者能够轻松地实现多数据源的配置和使用。
2. 准备工作
在开始之前,请确保你已经安装了以下软件和组件:
- Java开发环境
- Spring Boot框架
3. 创建Spring Boot项目
首先,让我们创建一个基本的Spring Boot项目。假设我们的包名是cn.juwatech.multidatasourcedemo
。
package cn.juwatech.multidatasourcedemo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class MultiDataSourceDemoApplication { public static void main(String[] args) { SpringApplication.run(MultiDataSourceDemoApplication.class, args); } }
4. 配置多数据源
在application.properties
中配置多个数据源的连接信息:
# 数据源1 spring.datasource.first.url=jdbc:mysql://localhost:3306/first_db spring.datasource.first.username=root spring.datasource.first.password=secret spring.datasource.first.driver-class-name=com.mysql.jdbc.Driver # 数据源2 spring.datasource.second.url=jdbc:mysql://localhost:3306/second_db spring.datasource.second.username=root spring.datasource.second.password=secret spring.datasource.second.driver-class-name=com.mysql.jdbc.Driver
5. 创建多数据源配置类
编写一个配置类,分别配置和注入多个数据源:
package cn.juwatech.multidatasourcedemo.config; import javax.sql.DataSource; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; @Configuration public class DataSourceConfig { @Bean(name = "firstDataSource") @ConfigurationProperties(prefix = "spring.datasource.first") public DataSource firstDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondDataSource") @ConfigurationProperties(prefix = "spring.datasource.second") public DataSource secondDataSource() { return DataSourceBuilder.create().build(); } }
6. 创建JPA Repository
为每个数据源创建对应的JPA Repository接口:
package cn.juwatech.multidatasourcedemo.repository.first; import cn.juwatech.multidatasourcedemo.model.first.FirstEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface FirstEntityRepository extends JpaRepository<FirstEntity, Long> { }
package cn.juwatech.multidatasourcedemo.repository.second; import cn.juwatech.multidatasourcedemo.model.second.SecondEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface SecondEntityRepository extends JpaRepository<SecondEntity, Long> { }
7. 编写实体类
分别创建每个数据源的实体类,例如:
package cn.juwatech.multidatasourcedemo.model.first; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class FirstEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // 省略Getter和Setter方法 }
package cn.juwatech.multidatasourcedemo.model.second; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class SecondEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String description; // 省略Getter和Setter方法 }
8. 使用多数据源
在Service层或Controller层使用@Qualifier
注解指定具体的数据源:
package cn.juwatech.multidatasourcedemo.service; import cn.juwatech.multidatasourcedemo.model.first.FirstEntity; import cn.juwatech.multidatasourcedemo.model.second.SecondEntity; import cn.juwatech.multidatasourcedemo.repository.first.FirstEntityRepository; import cn.juwatech.multidatasourcedemo.repository.second.SecondEntityRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class DataService { @Autowired @Qualifier("firstDataSource") private FirstEntityRepository firstRepository; @Autowired @Qualifier("secondDataSource") private SecondEntityRepository secondRepository; @Transactional(transactionManager = "firstTransactionManager") public void saveDataToFirstDB(FirstEntity entity) { firstRepository.save(entity); } @Transactional(transactionManager = "secondTransactionManager") public void saveDataToSecondDB(SecondEntity entity) { secondRepository.save(entity); } }
9. 测试和部署
完成以上步骤后,可以启动Spring Boot应用程序,并测试多数据源的读写操作。确保每个数据源配置正确,并能够正常连接和操作数据库。
10. 总结
通过本文,我们详细介绍了如何在Spring Boot应用中配置和使用多数据源。从配置多个数据源的连接信息,到编写对应的Repository和实体类,再到在Service层使用@Qualifier
注解指定数据源,我们逐步了解了如何处理复杂应用中的多数据源需求。