Spring Boot配置多个数据库连接
在实际应用程序中,经常会遇到需要连接多个数据库的情况,比如主数据库和日志数据库等。Spring Boot提供了简单方便的方式来配置多个数据库连接,让开发者可以轻松地管理多个数据库链接。
准备工作
在开始配置多个数据库连接之前,首先需要创建两个数据库,并且分别为它们创建对应的数据库表。在本文中,我们将创建一个名为main_db
的主数据库和一个名为log_db
的日志数据库。
配置文件
首先,在src/main/resources
目录下创建一个名为application.properties
的配置文件,用来配置两个数据库的连接信息。
# 主数据库配置
spring.datasource.main_db.url=jdbc:mysql://localhost:3306/main_db
spring.datasource.main_db.username=root
spring.datasource.main_db.password=password
# 日志数据库配置
spring.datasource.log_db.url=jdbc:mysql://localhost:3306/log_db
spring.datasource.log_db.username=root
spring.datasource.log_db.password=password
数据源配置
接下来,在Spring Boot应用程序的主类中进行数据源的配置,需要创建两个数据源分别连接到两个数据库。
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
@SpringBootApplication
public class MultiDatabaseApplication {
@Bean(name = "mainDataSource")
@Primary
public DataSource mainDataSource() {
return DataSourceBuilder.create()
.url("spring.datasource.main_db.url")
.username("spring.datasource.main_db.username")
.password("spring.datasource.main_db.password")
.build();
}
@Bean(name = "logDataSource")
public DataSource logDataSource() {
return DataSourceBuilder.create()
.url("spring.datasource.log_db.url")
.username("spring.datasource.log_db.username")
.password("spring.datasource.log_db.password")
.build();
}
}
JPA配置
如果使用JPA来操作数据库,还需要配置对应的EntityManagerFactory和TransactionManager,确保JPA知道要使用哪个数据源。
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy;
import org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
@SpringBootApplication
public class MultiDatabaseApplication {
// 省略mainDataSource和logDataSource的配置
@Bean
public LocalContainerEntityManagerFactoryBean mainEntityManagerFactory(EntityManagerFactoryBuilder builder, DataSource mainDataSource, JpaProperties jpaProperties) {
return builder.dataSource(mainDataSource)
.packages("com.example.main.entity")
.properties(jpaProperties.getProperties())
.persistenceUnit("main")
.build();
}
@Bean
public LocalContainerEntityManagerFactoryBean logEntityManagerFactory(EntityManagerFactoryBuilder builder, DataSource logDataSource, JpaProperties jpaProperties) {
return builder.dataSource(logDataSource)
.packages("com.example.log.entity")
.properties(jpaProperties.getProperties())
.persistenceUnit("log")
.build();
}
@Bean
public JpaTransactionManager mainTransactionManager(EntityManagerFactory mainEntityManagerFactory) {
return new JpaTransactionManager(mainEntityManagerFactory);
}
@Bean
public JpaTransactionManager logTransactionManager(EntityManagerFactory logEntityManagerFactory) {
return new JpaTransactionManager(logEntityManagerFactory);
}
}
使用不同的数据库
在代码中使用不同的数据库非常简单,只需要在需要操作数据库的地方指定使用哪个数据源即可。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaDialect;
import org.springframework.stereotype.Service;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.transaction.Transactional;
@Service
public class UserService {
@Autowired
private EntityManagerFactory mainEntityManagerFactory;
@Autowired
private EntityManagerFactory logEntityManagerFactory;
@Transactional("mainTransactionManager")
public void saveUserToMainDatabase(User user) {
EntityManager entityManager = mainEntityManagerFactory.createEntityManager();
entityManager.persist(user);
}
@Transactional("logTransactionManager")
public void saveUserToLogDatabase(User user) {
EntityManager entityManager = logEntityManagerFactory.createEntityManager();
entityManager.persist(user);
}
}
总结
通过以上配置,我们成功地实现了在Spring Boot应用程序中配置多个数据库连接,使得我们可以方便地操作不同的数据库。在实际应用中,这种多数据库连接的场