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应用程序中配置多个数据库连接,使得我们可以方便地操作不同的数据库。在实际应用中,这种多数据库连接的场