欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > SpringBoot 整合mongoDB并自定义连接池,实现多数据源配置

SpringBoot 整合mongoDB并自定义连接池,实现多数据源配置

2025/2/28 18:55:27 来源:https://blog.csdn.net/qq_34484062/article/details/117564018  浏览:    关键词:SpringBoot 整合mongoDB并自定义连接池,实现多数据源配置

       要想在同一个springboot项目中使用多个数据源,最主要是每个数据源都有自己的mongoTemplate和MongoDbFactory。mongoTemplate和MongoDbFactory是负责对数据源进行交互的并管理链接的。

       spring提供了一个注解@EnableMongoRepositories 用来注释在某些路径下的MongoRepositor实现类使用哪个MongoTemplate实例。当然如果我们是直接使用MongoTemplate操作,那么只需要使用于数据库对应的MongoTemplate即可。

代码结果如下:

首先实现两个config,实现对MongoTemplate和MongoDbFactory的配置

  • mongoTemplate1和mongoDbFactory1:并使用@EnableMongoRepositories指定在“com.zhong.springdemo.mangodbdome.mongodb1”目录下的MongoRepositor使用这些配置。
@Configuration
//指定com.zhong.springdemo.mangodbdome.mongodb1路径下的MongoRepository使用 容器中的  mongoTemplate1实例
@EnableMongoRepositories(mongoTemplateRef = "mongoTemplate1",basePackages = {"com.zhong.springdemo.mangodbdome.mongodb1"})
public class MongoDbConfigure {@AutowiredMongoDbFactoryProperties mongoDbFactoryProperties;/*** 自定义 mongoTemplate 实现多数据源配置*/@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) {//创建客户端参数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);}//创建认证客户端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);}/** 创建非认证客户端*///MongoClient mongoClient = new MongoClient(serverAddresses, mongoClientOptions);return new SimpleMongoDbFactory(mongoClient, properties.getDatabase());}/*** mongo客户端参数配置* @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 转换器* @return*/private MappingMongoConverter mappingMongoConverter(MongoDbFactory mongoDbFactory1, MongoMappingContext context) {DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory1);MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);//此处是去除插入数据库的 _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实例
@EnableMongoRepositories(mongoTemplateRef = "mongoTemplate2",basePackages = {"com.zhong.springdemo.mangodbdome.mongodb2"})
public class MongoDbConfigure2 {@AutowiredMongoDbFactoryProperties mongoDbFactoryProperties;/*** 自定义 mongoTemplate 实现多数据源配置*/@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) {//创建客户端参数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);}//创建认证客户端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);}/** 创建非认证客户端*///MongoClient mongoClient = new MongoClient(serverAddresses, mongoClientOptions);return new SimpleMongoDbFactory(mongoClient, properties.getDatabase());}/*** mongo客户端参数配置* @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 转换器* @return*/private MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context) {DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);//此处是去除插入数据库的 _class 字段mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));return mappingConverter;}
}
  • Repository实现

实现mongdb1下的repository---UserInfoTestRepository,UserInfoTestRepository使用的是mongoTemplate2和mongoDbFactory2

@Repository
public interface UserInfoTestRepository extends MongoRepository<UserInfoEntity, String> {List<UserInfoEntity> findByUserNameLike(String username);List<UserInfoEntity> findByUserName(String username);
}

实现mongdb2下的repository---UserInfRepository, UserInfRepository使用的是mongoTemplate1和mongoDbFactory1

@Repository
public interface UserInfoRepository extends MongoRepository<UserInfoEntity, String> {List<UserInfoEntity> findByUserNameLike(String username);List<UserInfoEntity> findByUserName(String username);
}
  •  实现service

使用Repository实现的访问的service

@Service
public class UserInfoServiceImpl implements UserInfoService {@Autowiredprivate UserInfoRepository userInfoRepository;@Autowiredprivate UserInfoTestRepository userInfoTestRepository;@Overridepublic List<UserInfoEntity> findByUserName(String userName){return userInfoRepository.findByUserName(userName);}@Overridepublic 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();}@Overridepublic 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实现的访问的service

@Service
public class UserInfoMongoTemplateServiceImpl implements UserInfoMongoTemplateService {@AutowiredMongoTemplate mongoTemplate1;@AutowiredMongoTemplate mongoTemplate2;@Overridepublic List<UserInfoEntity> findByUserName(String userName){Criteria criteria = Criteria.where("user_name").is(userName);return mongoTemplate1.find(getQueryFilter(criteria), UserInfoEntity.class);}@Overridepublic 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();}@Overridepublic 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;}
}

 两个数据源信息配置properties.yaml:

zhong:#自定义的mongodb测试data:mongodb:database: zhong-mongopassword: 123456address: 127.0.0.1:27017username: adminauthenticationDatabase: adminmongodb2:database: test-mongopassword: 123456address: 127.0.0.1:27017username: adminauthenticationDatabase: admin

测试类:

@Component
public class MongoStartTest implements CommandLineRunner {@AutowiredUserInfoService userInfoService;@AutowiredUserInfoMongoTemplateService userInfoMongoTemplateService;@Overridepublic 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("用户名");}
}

结果如图:

数据的确被插入到不同的库中了

参考:

http://www.voidcn.com/article/p-zqjtjvhm-bvu.html

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词