SpringBoot整合mongoDB并自定義連接池實(shí)現(xiàn)多數(shù)據(jù)源配置教程
SpringBoot整合mongoDB并自定義連接池實(shí)現(xiàn)多數(shù)據(jù)源配置
要想在同一個(gè)springboot項(xiàng)目中使用多個(gè)數(shù)據(jù)源,最主要是每個(gè)數(shù)據(jù)源都有自己的mongoTemplate和MongoDbFactory。mongoTemplate和MongoDbFactory是負(fù)責(zé)對(duì)數(shù)據(jù)源進(jìn)行交互的并管理鏈接的。
spring提供了一個(gè)注解@EnableMongoRepositories 用來注釋在某些路徑下的MongoRepositor實(shí)現(xiàn)類使用哪個(gè)MongoTemplate實(shí)例。當(dāng)然如果我們是直接使用MongoTemplate操作,那么只需要使用于數(shù)據(jù)庫(kù)對(duì)應(yīng)的MongoTemplate即可。
代碼結(jié)果如下:

首先實(shí)現(xiàn)兩個(gè)config,實(shí)現(xiàn)對(duì)MongoTemplate和MongoDbFactory的配置
mongoTemplate1和mongoDbFactory1
- 并使用@EnableMongoRepositories指定在“com.zhong.springdemo.mangodbdome.mongodb1”目錄下的MongoRepositor使用這些配置。
@Configuration
//指定com.zhong.springdemo.mangodbdome.mongodb1路徑下的MongoRepository使用 容器中的 mongoTemplate1實(shí)例
@EnableMongoRepositories(mongoTemplateRef = "mongoTemplate1",basePackages = {"com.zhong.springdemo.mangodbdome.mongodb1"})
public class MongoDbConfigure {
@Autowired
MongoDbFactoryProperties mongoDbFactoryProperties;
/**
* 自定義 mongoTemplate 實(shí)現(xiàn)多數(shù)據(jù)源配置
*/
@Bean("mongoTemplate1")
public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory1, MongoMappingContext context){
MappingMongoConverter mappingMongoConverter = mappingMongoConverter(mongoDbFactory1, context);
MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory1, mappingMongoConverter);
return mongoTemplate;
}
/**
* 自定義mongo連接池
* @param properties 私有配置
* @return
*/
@Bean("mongoDbFactory1")
public MongoDbFactory mongoDbFactory(MongoDbProperties properties) {
//創(chuàng)建客戶端參數(shù)
MongoClientOptions options = mongoClientOptions(properties);
//解析地址
List<ServerAddress> serverAddresses = new ArrayList<>();
for (String address : properties.getAddress().split(",")) {
String[] hostAndPort = address.split(":");
String host = hostAndPort[0];
Integer port = Integer.parseInt(hostAndPort[1]);
ServerAddress serverAddress = new ServerAddress(host, port);
serverAddresses.add(serverAddress);
}
//創(chuàng)建認(rèn)證客戶端
MongoCredential mongoCredential = MongoCredential.createScramSha1Credential(properties.getUsername(),
properties.getAuthenticationDatabase() != null ? properties.getAuthenticationDatabase() : properties.getDatabase(),
properties.getPassword().toCharArray());
MongoClient mongoClient = new MongoClient(serverAddresses.get(0), mongoCredential, options);
//集群模式
if (serverAddresses.size() > 1) {
mongoClient = new MongoClient(serverAddresses, mongoCredential, null);
}
/** 創(chuàng)建非認(rèn)證客戶端*/
//MongoClient mongoClient = new MongoClient(serverAddresses, mongoClientOptions);
return new SimpleMongoDbFactory(mongoClient, properties.getDatabase());
}
/**
* mongo客戶端參數(shù)配置
* @return
*/
private MongoClientOptions mongoClientOptions(MongoDbProperties properties) {
MongoDbFactoryProperties factoryProperties = this.mongoDbFactoryProperties;
return MongoClientOptions.builder()
.connectTimeout(factoryProperties.getConnectionTimeoutMs())
.socketTimeout(factoryProperties.getReadTimeoutMs()).applicationName(factoryProperties.getApplicationName())
.heartbeatConnectTimeout(factoryProperties.getHeartbeatConnectionTimeoutMs())
.heartbeatSocketTimeout(factoryProperties.getHeartbeatReadTimeoutMs())
.heartbeatFrequency(factoryProperties.getHeartbeatFrequencyMs())
.minHeartbeatFrequency(factoryProperties.getMinHeartbeatFrequencyMs())
.maxConnectionIdleTime(factoryProperties.getConnectionMaxIdleTimeMs())
.maxConnectionLifeTime(factoryProperties.getConnectionMaxLifeTimeMs())
.maxWaitTime(factoryProperties.getPoolMaxWaitTimeMs())
.connectionsPerHost(factoryProperties.getConnectionsPerHost())
.threadsAllowedToBlockForConnectionMultiplier(
factoryProperties.getThreadsAllowedToBlockForConnectionMultiplier())
.minConnectionsPerHost(factoryProperties.getMinConnectionsPerHost()).build();
}
/**
* monogo 轉(zhuǎn)換器
* @return
*/
private MappingMongoConverter mappingMongoConverter(MongoDbFactory mongoDbFactory1, MongoMappingContext context) {
DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory1);
MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);
//此處是去除插入數(shù)據(jù)庫(kù)的 _class 字段
mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
return mappingConverter;
}
}mongoTemplate2和mongoDbFactory2
- 并使用@EnableMongoRepositories指定在“com.zhong.springdemo.mangodbdome.mongodb2”目錄下的MongoRepositor使用這些配置。
@Configuration
//指定com.zhong.springdemo.mangodbdome.mongodb2路徑下的MongoRepository使用 容器中的 mongoTemplate2實(shí)例
@EnableMongoRepositories(mongoTemplateRef = "mongoTemplate2",basePackages = {"com.zhong.springdemo.mangodbdome.mongodb2"})
public class MongoDbConfigure2 {
@Autowired
MongoDbFactoryProperties mongoDbFactoryProperties;
/**
* 自定義 mongoTemplate 實(shí)現(xiàn)多數(shù)據(jù)源配置
*/
@Bean("mongoTemplate2")
public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory2, MongoMappingContext context){
MappingMongoConverter mappingMongoConverter = mappingMongoConverter(mongoDbFactory2, context);
MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory2, mappingMongoConverter);
return mongoTemplate;
}
/**
* 自定義mongo連接池
* @param properties 私有配置
* @return
*/
@Bean("mongoDbFactory2")
public MongoDbFactory mongoDbFactory2(MongoDbProperties2 properties) {
//創(chuàng)建客戶端參數(shù)
MongoClientOptions options = mongoClientOptions(properties);
//解析地址
List<ServerAddress> serverAddresses = new ArrayList<>();
for (String address : properties.getAddress().split(",")) {
String[] hostAndPort = address.split(":");
String host = hostAndPort[0];
Integer port = Integer.parseInt(hostAndPort[1]);
ServerAddress serverAddress = new ServerAddress(host, port);
serverAddresses.add(serverAddress);
}
//創(chuàng)建認(rèn)證客戶端
MongoCredential mongoCredential = MongoCredential.createScramSha1Credential(properties.getUsername(),
properties.getAuthenticationDatabase() != null ? properties.getAuthenticationDatabase() : properties.getDatabase(),
properties.getPassword().toCharArray());
MongoClient mongoClient = new MongoClient(serverAddresses.get(0), mongoCredential, options);
//集群模式
if (serverAddresses.size() > 1) {
mongoClient = new MongoClient(serverAddresses, mongoCredential, null);
}
/** 創(chuàng)建非認(rèn)證客戶端*/
//MongoClient mongoClient = new MongoClient(serverAddresses, mongoClientOptions);
return new SimpleMongoDbFactory(mongoClient, properties.getDatabase());
}
/**
* mongo客戶端參數(shù)配置
* @return
*/
private MongoClientOptions mongoClientOptions(MongoDbProperties2 properties) {
MongoDbFactoryProperties factoryProperties = this.mongoDbFactoryProperties;
return MongoClientOptions.builder()
.connectTimeout(factoryProperties.getConnectionTimeoutMs())
.socketTimeout(factoryProperties.getReadTimeoutMs()).applicationName(factoryProperties.getApplicationName())
.heartbeatConnectTimeout(factoryProperties.getHeartbeatConnectionTimeoutMs())
.heartbeatSocketTimeout(factoryProperties.getHeartbeatReadTimeoutMs())
.heartbeatFrequency(factoryProperties.getHeartbeatFrequencyMs())
.minHeartbeatFrequency(factoryProperties.getMinHeartbeatFrequencyMs())
.maxConnectionIdleTime(factoryProperties.getConnectionMaxIdleTimeMs())
.maxConnectionLifeTime(factoryProperties.getConnectionMaxLifeTimeMs())
.maxWaitTime(factoryProperties.getPoolMaxWaitTimeMs())
.connectionsPerHost(factoryProperties.getConnectionsPerHost())
.threadsAllowedToBlockForConnectionMultiplier(
factoryProperties.getThreadsAllowedToBlockForConnectionMultiplier())
.minConnectionsPerHost(factoryProperties.getMinConnectionsPerHost()).build();
}
/**
* monogo 轉(zhuǎn)換器
* @return
*/
private MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context) {
DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);
//此處是去除插入數(shù)據(jù)庫(kù)的 _class 字段
mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
return mappingConverter;
}
}Repository實(shí)現(xiàn)
實(shí)現(xiàn)mongdb1下的repository---UserInfoTestRepository,UserInfoTestRepository使用的是mongoTemplate2和mongoDbFactory2
@Repository
public interface UserInfoTestRepository extends MongoRepository<UserInfoEntity, String> {
List<UserInfoEntity> findByUserNameLike(String username);
List<UserInfoEntity> findByUserName(String username);
}
實(shí)現(xiàn)mongdb2下的repository---UserInfRepository,UserInfRepository使用的是mongoTemplate1和mongoDbFactory1
@Repository
public interface UserInfoRepository extends MongoRepository<UserInfoEntity, String> {
List<UserInfoEntity> findByUserNameLike(String username);
List<UserInfoEntity> findByUserName(String username);
}實(shí)現(xiàn)service
使用Repository實(shí)現(xiàn)的訪問的service
@Service
public class UserInfoServiceImpl implements UserInfoService {
@Autowired
private UserInfoRepository userInfoRepository;
@Autowired
private UserInfoTestRepository userInfoTestRepository;
@Override
public List<UserInfoEntity> findByUserName(String userName){
return userInfoRepository.findByUserName(userName);
}
@Override
public int saveTestUser(List<UserInfoDto> userInfoDtos) {
List<UserInfoEntity> userInfoEntities = Lists.newArrayList();
for(UserInfoDto userInfoDto : userInfoDtos){
UserInfoEntity userInfoEntity = new UserInfoEntity();
BeanUtils.copyProperties(userInfoDto, userInfoEntity);
userInfoEntities.add(userInfoEntity);
}
userInfoTestRepository.saveAll(userInfoEntities);
return userInfoEntities.size();
}
@Override
public int saveUser(List<UserInfoDto> userInfoDtos) {
List<UserInfoEntity> userInfoEntities = Lists.newArrayList();
for(UserInfoDto userInfoDto : userInfoDtos){
UserInfoEntity userInfoEntity = new UserInfoEntity();
BeanUtils.copyProperties(userInfoDto, userInfoEntity);
userInfoEntities.add(userInfoEntity);
}
userInfoRepository.saveAll(userInfoEntities);
return userInfoEntities.size();
}
}使用MongoTemplate實(shí)現(xiàn)的訪問的service
@Service
public class UserInfoMongoTemplateServiceImpl implements UserInfoMongoTemplateService {
@Autowired
MongoTemplate mongoTemplate1;
@Autowired
MongoTemplate mongoTemplate2;
@Override
public List<UserInfoEntity> findByUserName(String userName){
Criteria criteria = Criteria.where("user_name").is(userName);
return mongoTemplate1.find(getQueryFilter(criteria), UserInfoEntity.class);
}
@Override
public int saveTestUser(List<UserInfoDto> userInfoDtos) {
List<UserInfoEntity> userInfoEntities = Lists.newArrayList();
for(UserInfoDto userInfoDto : userInfoDtos){
UserInfoEntity userInfoEntity = new UserInfoEntity();
BeanUtils.copyProperties(userInfoDto, userInfoEntity);
userInfoEntities.add(userInfoEntity);
}
mongoTemplate1.insert(userInfoEntities, UserInfoEntity.class);
return userInfoEntities.size();
}
@Override
public int saveUser(List<UserInfoDto> userInfoDtos) {
List<UserInfoEntity> userInfoEntities = Lists.newArrayList();
for(UserInfoDto userInfoDto : userInfoDtos){
UserInfoEntity userInfoEntity = new UserInfoEntity();
BeanUtils.copyProperties(userInfoDto, userInfoEntity);
userInfoEntities.add(userInfoEntity);
}
mongoTemplate2.insert(userInfoEntities, UserInfoEntity.class);
return userInfoEntities.size();
}
private Query getQueryFilter(Criteria criteria, String ...parms) {
criteria = criteria == null ? new Criteria() : criteria;
Query query = new Query();
query.addCriteria(criteria);
if(parms != null && parms.length > 0){
Field fields = query.fields();
for(String parm : parms){
fields.include(parm);
}
}
return query;
}
}兩個(gè)數(shù)據(jù)源信息配置properties.yaml:
zhong:
#自定義的mongodb測(cè)試
data:
mongodb:
database: zhong-mongo
password: 123456
address: 127.0.0.1:27017
username: admin
authenticationDatabase: admin
mongodb2:
database: test-mongo
password: 123456
address: 127.0.0.1:27017
username: admin
authenticationDatabase: admin測(cè)試類:
@Component
public class MongoStartTest implements CommandLineRunner {
@Autowired
UserInfoService userInfoService;
@Autowired
UserInfoMongoTemplateService userInfoMongoTemplateService;
@Override
public void run(String... args) throws Exception {
for(int i = 0; i < 25; i++){
UserInfoDto userInfoDto = new UserInfoDto();
userInfoDto.setUserId(UUID.randomUUID().toString().replace("-", ""));
userInfoDto.setUserName("用戶名" + i);
userInfoDto.setAuthor("登錄名" + i);
userInfoDto.setPwd("123456" + i);
userInfoDto.setCreateTime(new Date());
userInfoService.saveTestUser(Lists.newArrayList(userInfoDto));
userInfoService.saveUser(Lists.newArrayList(userInfoDto));
}
for(int i = 100; i < 125; i++){
UserInfoDto userInfoDto = new UserInfoDto();
userInfoDto.setUserId(UUID.randomUUID().toString().replace("-", ""));
userInfoDto.setUserName("用戶名" + i);
userInfoDto.setAuthor("登錄名" + i);
userInfoDto.setPwd("123456" + i);
userInfoDto.setCreateTime(new Date());
userInfoMongoTemplateService.saveTestUser(Lists.newArrayList(userInfoDto));
userInfoMongoTemplateService.saveUser(Lists.newArrayList(userInfoDto));
}
userInfoService.findByUserName("用戶名");
userInfoMongoTemplateService.findByUserName("用戶名");
}
}結(jié)果如圖:
數(shù)據(jù)的確被插入到不同的庫(kù)中了

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java如何使用while循環(huán)計(jì)算一個(gè)整數(shù)的位數(shù)
這篇文章主要介紹了Java使用while循環(huán)計(jì)算一個(gè)整數(shù)的位數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
使用SpringBoot+nmap4j獲取端口信息的代碼詳解
這篇文章主要介紹了使用 SpringBoot + nmap4j 獲取端口信息,包括需求背景、nmap4j 的相關(guān)介紹、代碼說明(含測(cè)試代碼、改造后的代碼及參數(shù)說明),還提到了文件讀取方式和依賴引入方式,最終請(qǐng)求能獲取到數(shù)據(jù),需要的朋友可以參考下2025-01-01
Java代碼實(shí)現(xiàn)哈希表(google 公司的上機(jī)題)
這篇文章主要介紹了Java 哈希表詳解(google 公司的上機(jī)題),本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Spring調(diào)度框架EnableScheduling&Scheduled源碼解析
這篇文章主要介紹了Spring調(diào)度框架EnableScheduling&Scheduled源碼解析,@EnableScheduling&Scheduled定時(shí)調(diào)度框架,本著不僅知其然還要知其所以然的指導(dǎo)思想,下面對(duì)該調(diào)度框架進(jìn)行源碼解析,以便更好的理解其執(zhí)行過程,需要的朋友可以參考下2024-01-01
Spring Boot實(shí)現(xiàn)SSE實(shí)時(shí)推送實(shí)戰(zhàn)示例
本文給大家介紹基于SpringBoot實(shí)現(xiàn)SSE示例,包括創(chuàng)建項(xiàng)目、SSE控制器處理連接與消息推送、跨域配置、客戶端使用EventSource訂閱,以及動(dòng)態(tài)推送和WebFlux擴(kuò)展,感興趣的朋友跟隨小編一起看看吧2025-08-08

