SpringBoot配置连接两个或多个数据库的实现

  

要在Spring Boot中配置连接多个数据库,需要完成以下几个步骤:

  1. 配置数据库连接信息
  2. 创建数据源和实体管理器工厂对象
  3. 创建事务管理器
  4. 注入数据源和事务管理器
  5. 在实体类中指定使用的数据源

下面通过两个示例详细说明如何实现这个过程。

示例一:连接MySQL和Redis数据库

  1. 配置数据库连接信息

application.properties文件中配置MySQL和Redis数据库连接信息:

# MySQL
spring.datasource.url=jdbc:mysql://localhost:3306/database_name?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# Redis
spring.redis.host=localhost
spring.redis.port=6379
  1. 创建数据源和实体管理器工厂对象

@Configuration注解标注的配置类中,创建数据源和实体管理器工厂对象:

@Configuration
@EnableTransactionManagement
public class DataSourceConfiguration {

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(dataSource()).packages("com.example.entity.mysql").persistenceUnit("mysql").build();
    }

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new JedisConnectionFactory();
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setDefaultSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

其中,@Bean注解表示创建对象并交由Spring管理,@Primary注解表示优先使用该对象实例。

  1. 创建事务管理器

创建名为transactionManager的事务管理器:

@Configuration
@EnableTransactionManagement
public class TransactionConfiguration {

    @Autowired
    private LocalContainerEntityManagerFactoryBean entityManagerFactory;

    @Autowired
    private DataSource dataSource;

    @Bean
    public JpaTransactionManager transactionManager() {
        return new JpaTransactionManager(entityManagerFactory.getObject());
    }

    @Bean(name = "mysqlTransactionManager")
    public DataSourceTransactionManager mysqlTransactionManager() {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "redisTransactionManager")
    public RedisTransactionManager redisTransactionManager(RedisTemplate<String, Object> redisTemplate) {
        return new RedisTransactionManager(redisTemplate);
    }
}

其中,JpaTransactionManager适用于MySQL数据库,DataSourceTransactionManager适用于连接MySQL数据库的事务,RedisTransactionManager适用于连接Redis数据库的事务。

  1. 注入数据源和事务管理器

在需要使用的类中,使用@Qualifier注解注入特定的数据源和事务管理器:

@Service
public class UserService {

    @Autowired
    @Qualifier("mysqlTransactionManager")
    private PlatformTransactionManager mysqlTransactionManager;

    @Autowired
    @Qualifier("redisTransactionManager")
    private PlatformTransactionManager redisTransactionManager;

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Transactional(transactionManager = "mysqlTransactionManager")
    public void addUser(User user) {
        userRepository.save(user);
    }

    @Transactional(transactionManager = "redisTransactionManager")
    public void cacheUser(User user) {
        redisTemplate.opsForValue().set(user.getId(), user);
    }
}

在方法上加上@Transactional注解,指定使用的事务管理器。

  1. 在实体类中指定使用的数据源

在需要使用MySQL数据库的实体类上加上@Entity@Table等注解:

@Entity
@Table(name = "users")
public class User {
    // ...
}

在需要使用Redis数据库的实体类中继承org.springframework.data.redis.core.RedisHash接口:

@RedisHash("users")
public class UserCache {
    // ...
}

示例二:连接PostgreSQL和MongoDB数据库

  1. 配置数据库连接信息

application.properties文件中配置PostgreSQL和MongoDB数据库连接信息:

# PostgreSQL
spring.datasource.url=jdbc:postgresql://localhost:5432/database_name
spring.datasource.username=username
spring.datasource.password=password

# MongoDB
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=database_name
spring.data.mongodb.username=username
spring.data.mongodb.password=password
  1. 创建数据源和实体管理器工厂对象

@Configuration注解标注的配置类中,创建数据源和实体管理器工厂对象:

@Configuration
@EnableTransactionManagement
public class DataSourceConfiguration {

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(dataSource()).packages("com.example.entity.postgresql").persistenceUnit("postgresql").build();
    }

    @Bean
    public MongoTemplate mongoTemplate() {
        return new MongoTemplate(mongoClient(), "database_name");
    }

    @Bean
    public MongoClient mongoClient() {
        return new MongoClient(new ServerAddress("localhost", 27017), mongoClientOptions());
    }

    @Bean
    public MongoClientOptions mongoClientOptions() {
        return MongoClientOptions.builder()
                .socketTimeout(3000)
                .connectTimeout(3000)
                .maxWaitTime(3000)
                .build();
    }
}

其中,MongoTemplate是MongoDB的操作类,MongoClient是MongoDB的客户端,MongoClientOptions是MongoDB的客户端配置。

  1. 创建事务管理器

创建名为transactionManager的事务管理器:

@Configuration
@EnableTransactionManagement
public class TransactionConfiguration {

    @Autowired
    private LocalContainerEntityManagerFactoryBean entityManagerFactory;

    @Autowired
    private DataSource dataSource;

    @Autowired
    private MongoTemplate mongoTemplate;

    @Bean
    public JpaTransactionManager transactionManager() {
        return new JpaTransactionManager(entityManagerFactory.getObject());
    }

    @Bean(name = "postgresqlTransactionManager")
    public DataSourceTransactionManager postgresqlTransactionManager() {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "mongoTransactionManager")
    public MongoTransactionManager mongoTransactionManager() {
        DefaultTransactionOptions options = new DefaultTransactionOptions();
        options.defaultTimeout(3, TimeUnit.SECONDS);
        return new MongoTransactionManager(mongoDbFactory(), options);
    }

    @Bean
    public MongoDbFactory mongoDbFactory() {
        return new SimpleMongoDbFactory(mongoClient(), "database_name");
    }

    @Bean
    public MongoClient mongoClient() {
        return new MongoClient(new ServerAddress("localhost", 27017), mongoClientOptions());
    }

    @Bean
    public MongoClientOptions mongoClientOptions() {
        return MongoClientOptions.builder()
                .socketTimeout(3000)
                .connectTimeout(3000)
                .maxWaitTime(3000)
                .build();
    }
}

其中,JpaTransactionManager适用于PostgreSQL数据库,DataSourceTransactionManager适用于连接PostgreSQL数据库的事务,MongoTransactionManager适用于连接MongoDB数据库的事务。

  1. 注入数据源和事务管理器

在需要使用的类中,使用@Qualifier注解注入特定的数据源和事务管理器:

@Service
public class UserService {

    @Autowired
    @Qualifier("postgresqlTransactionManager")
    private PlatformTransactionManager postgresqlTransactionManager;

    @Autowired
    @Qualifier("mongoTransactionManager")
    private PlatformTransactionManager mongoTransactionManager;

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private MongoTemplate mongoTemplate;

    @Transactional(transactionManager = "postgresqlTransactionManager")
    public void addUser(User user) {
        userRepository.save(user);
    }

    @Transactional(transactionManager = "mongoTransactionManager")
    public void cacheUser(User user) {
        mongoTemplate.insert(user, "users");
    }
}

在方法上加上@Transactional注解,指定使用的事务管理器。

  1. 在实体类中指定使用的数据源

在需要使用PostgreSQL数据库的实体类上加上@Entity@Table等注解:

@Entity
@Table(name = "users")
public class User {
    // ...
}

在需要使用MongoDB数据库的实体类中不需要额外加注解。

通过以上步骤,可以在Spring Boot中成功连接MySQL、Redis、PostgreSQL和MongoDB等多个数据库,实现在同一个应用中访问多个数据库的需求。

相关文章