在Spring Boot中配置多数据源可以使用两种方法:使用Spring Boot的自动配置模块或者手动配置数据源。
***种方法是使用Spring Boot的自动配置模块。Spring Boot提供了一个叫做"spring-boot-starter-data-jpa"的组件,它默认使用Hibernate作为JPA实现,可以方便地配置多个数据源。
首先,需要在pom.xml文件中引入spring-boot-starter-data-jpa组件:
```
```
然后,在application.properties文件中进行配置,指定多个数据源的连接信息:
```
spring.datasource.url=jdbc:mysql://localhost:3306/db1
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/db2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
```
接下来,在配置文件中创建多个数据源的配置类,分别对应不同的数据源:
```
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = "com.example.model.db1"
entityManagerFactoryRef = "db1EntityManagerFactory"
transactionManagerRef = "db1TransactionManager"
)
public class Db1DataSourceConfig {
@Primary
@Bean(name = "db1DataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource db1DataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "db1EntityManagerFactory")
public LocalContainerEntityManagerFactoryBean db1EntityManagerFactory(
EntityManagerFactoryBuilder builder
@Qualifier("db1DataSource") DataSource dataSource
) {
return builder
.dataSource(dataSource)
.packages("com.example.model.db1")
.build();
}
@Primary
@Bean(name = "db1TransactionManager")
public PlatformTransactionManager db1TransactionManager(
@Qualifier("db1EntityManagerFactory") EntityManagerFactory db1EntityManagerFactory
) {
return new JpaTransactionManager(db1EntityManagerFactory);
}
}
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = "com.example.model.db2"
entityManagerFactoryRef = "db2EntityManagerFactory"
transactionManagerRef = "db2TransactionManager"
)
public class Db2DataSourceConfig {
@Bean(name = "db2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource db2DataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "db2EntityManagerFactory")
public LocalContainerEntityManagerFactoryBean db2EntityManagerFactory(
EntityManagerFactoryBuilder builder
@Qualifier("db2DataSource") DataSource dataSource
) {
return builder
.dataSource(dataSource)
.packages("com.example.model.db2")
.build();
}
@Bean(name = "db2TransactionManager")
public PlatformTransactionManager db2TransactionManager(
@Qualifier("db2EntityManagerFactory") EntityManagerFactory db2EntityManagerFactory
) {
return new JpaTransactionManager(db2EntityManagerFactory);
}
}
```
以上配置中,@EnableJpaRepositories指定了实体类的扫描路径、EntityManagerFactory的引用和事务管理器的引用。
第二种方法是手动配置数据源。这种方法需要自己配置数据源、实体管理器工厂和事务管理器,相对繁琐一些。
首先,需要在pom.xml文件中引入相应的数据库驱动,例如MySQL的驱动:
```
```
然后,创建数据源的配置类,配置各个数据源的连接信息:
```
@Configuration
public class DataSourceConfig {
@Primary
@Bean(name = "db1DataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource db1DataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "db2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource db2DataSource() {
return DataSourceBuilder.create().build();
}
}
```
接下来,创建两个实体管理器工厂的配置类,分别对应不同的数据源:
```
@Configuration
@EnableJpaRepositories(
basePackages = "com.example.model.db1"
entityManagerFactoryRef = "db1EntityManagerFactory"
transactionManagerRef = "db1TransactionManager"
)
public class Db1EntityManagerFactoryConfig {
@Primary
@Bean(name = "db1EntityManagerFactory")
public LocalContainerEntityManagerFactoryBean db1EntityManagerFactory(
EntityManagerFactoryBuilder builder
@Qualifier("db1DataSource") DataSource dataSource
) {
return builder
.dataSource(dataSource)
.packages("com.example.model.db1")
.build();
}
@Primary
@Bean(name = "db1TransactionManager")
public PlatformTransactionManager db1TransactionManager(
@Qualifier("db1EntityManagerFactory") EntityManagerFactory db1EntityManagerFactory
) {
return new JpaTransactionManager(db1EntityManagerFactory);
}
}
@Configuration
@EnableJpaRepositories(
basePackages = "com.example.model.db2"
entityManagerFactoryRef = "db2EntityManagerFactory"
transactionManagerRef = "db2TransactionManager"
)
public class Db2EntityManagerFactoryConfig {
@Bean(name = "db2EntityManagerFactory")
public LocalContainerEntityManagerFactoryBean db2EntityManagerFactory(
EntityManagerFactoryBuilder builder
@Qualifier("db2DataSource") DataSource dataSource
) {
return builder
.dataSource(dataSource)
.packages("com.example.model.db2")
.build();
}
@Bean(name = "db2TransactionManager")
public PlatformTransactionManager db2TransactionManager(
@Qualifier("db2EntityManagerFactory") EntityManagerFactory db2EntityManagerFactory
) {
return new JpaTransactionManager(db2EntityManagerFactory);
}
}
```
***,将这些配置类加入到主配置类的扫描路径中,使得Spring Boot能够找到并加载这些配置:
```
@SpringBootApplication
@Import({DataSourceConfig.class
Db1EntityManagerFactoryConfig.class
Db2EntityManagerFactoryConfig.class})
public class MultiDataSourceApplication {
public static void main(String[] args) {
SpringApplication.run(MultiDataSourceApplication.class
args);
}
}
```
以上就是在Spring Boot中配置多数据源的方法。无论是使用Spring Boot的自动配置模块还是手动配置数据源,都可以实现多数据源的配置,根据具体需求选择适合的方法。