要在Spring Boot中配置连接多个数据库,需要完成以下几个步骤:
- 配置数据库连接信息
- 创建数据源和实体管理器工厂对象
- 创建事务管理器
- 注入数据源和事务管理器
- 在实体类中指定使用的数据源
下面通过两个示例详细说明如何实现这个过程。
示例一:连接MySQL和Redis数据库
- 配置数据库连接信息
在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
- 创建数据源和实体管理器工厂对象
在@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
注解表示优先使用该对象实例。
- 创建事务管理器
创建名为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数据库的事务。
- 注入数据源和事务管理器
在需要使用的类中,使用@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
注解,指定使用的事务管理器。
- 在实体类中指定使用的数据源
在需要使用MySQL数据库的实体类上加上@Entity
、@Table
等注解:
@Entity
@Table(name = "users")
public class User {
// ...
}
在需要使用Redis数据库的实体类中继承org.springframework.data.redis.core.RedisHash
接口:
@RedisHash("users")
public class UserCache {
// ...
}
示例二:连接PostgreSQL和MongoDB数据库
- 配置数据库连接信息
在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
- 创建数据源和实体管理器工厂对象
在@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的客户端配置。
- 创建事务管理器
创建名为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数据库的事务。
- 注入数据源和事务管理器
在需要使用的类中,使用@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
注解,指定使用的事务管理器。
- 在实体类中指定使用的数据源
在需要使用PostgreSQL数据库的实体类上加上@Entity
、@Table
等注解:
@Entity
@Table(name = "users")
public class User {
// ...
}
在需要使用MongoDB数据库的实体类中不需要额外加注解。
通过以上步骤,可以在Spring Boot中成功连接MySQL、Redis、PostgreSQL和MongoDB等多个数据库,实现在同一个应用中访问多个数据库的需求。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot配置连接两个或多个数据库的实现 - Python技术站