经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MongoDB » 查看文章
SpringBoot中使用MongoDB的连接池配置
来源:jb51  时间:2021/10/25 15:04:52  对本文有异议

在SpringBoot中,我们可以通过引入 spring-boot-starter-data-mongodb 依赖来实现spring-data-mongodb 的自动配置。但是,默认情况下,该依赖并没有像使用MySQL或者Redis那样为我们提供连接池配置的功能。因此,我们需要自行重写 MongoDbFactory,实现MongoDB客户端连接的参数配置扩展。需要说明的是,MongoDB的客户端本身就是一个连接池,因此,我们只需要配置客户端即可。

引入依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.0.2.RELEASE</version>
  5. </parent>
  6. <dependencies>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-test</artifactId>
  14. <scope>test</scope>
  15. </dependency>
  16. </dependencies>

配置文件

为了方便对Mongodb进行统一管理,我们将相关的配置抽取到 mongo-pool.properties 中,前缀为spring.data.mongodb(前缀可自己随意配置):

  1. spring.data.mongodb.address=172.16.250.234:27017,172.16.250.239:27017,172.16.250.240:27017
  2. spring.data.mongodb.replica-set=rs0
  3. spring.data.mongodb.database=test
  4. spring.data.mongodb.username=admin
  5. spring.data.mongodb.password=admin
  6. # Configure spring.data.mongodbDB Pool
  7. spring.data.mongodb.min-connections-per-host=10
  8. spring.data.mongodb.max-connections-per-host=100
  9. spring.data.mongodb.threads-allowed-to-block-for-connection-multiplier=5
  10. spring.data.mongodb.server-selection-timeout=30000
  11. spring.data.mongodb.max-wait-time=120000
  12. spring.data.mongodb.max-connection-idel-time=0
  13. spring.data.mongodb.max-connection-life-time=0
  14. spring.data.mongodb.connect-timeout=10000
  15. spring.data.mongodb.socket-timeout=0
  16. spring.data.mongodb.socket-keep-alive=false
  17. spring.data.mongodb.ssl-enabled=false
  18. spring.data.mongodb.ssl-invalid-host-name-allowed=false
  19. spring.data.mongodb.always-use-m-beans=false
  20. spring.data.mongodb.heartbeat-socket-timeout=20000
  21. spring.data.mongodb.heartbeat-connect-timeout=20000
  22. spring.data.mongodb.min-heartbeat-frequency=500
  23. spring.data.mongodb.heartbeat-frequency=10000
  24. spring.data.mongodb.local-threshold=15
  25. spring.data.mongodb.authentication-database=auth_dev

配置文件映射为JavaBean

为方便调用,将上述配置包装成一个配置实体类,代码如下:

  1. import java.util.List;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. import org.springframework.context.annotation.PropertySource;
  4. import org.springframework.stereotype.Component;
  5. @Component
  6. @PropertySource(value = "classpath:mongo-pool.properties")
  7. @ConfigurationProperties(prefix = "spring.data.mongodb")
  8. public class MongoSettingsProperties {
  9. private List<String> address;
  10. private String replicaSet;
  11. private String database;
  12. private String username;
  13. private String password;
  14. private Integer minConnectionsPerHost = 0;
  15. private Integer maxConnectionsPerHost = 100;
  16. private Integer threadsAllowedToBlockForConnectionMultiplier = 5;
  17. private Integer serverSelectionTimeout = 30000;
  18. private Integer maxWaitTime = 120000;
  19. private Integer maxConnectionIdleTime = 0;
  20. private Integer maxConnectionLifeTime = 0;
  21. private Integer connectTimeout = 10000;
  22. private Integer socketTimeout = 0;
  23. private Boolean socketKeepAlive = false;
  24. private Boolean sslEnabled = false;
  25. private Boolean sslInvalidHostNameAllowed = false;
  26. private Boolean alwaysUseMBeans = false;
  27. private Integer heartbeatConnectTimeout = 20000;
  28. private Integer heartbeatSocketTimeout = 20000;
  29. private Integer minHeartbeatFrequency = 500;
  30. private Integer heartbeatFrequency = 10000;
  31. private Integer localThreshold = 15;
  32. private String authenticationDatabase;
  33. // 省略Getters和Setters方法
  34. }

覆盖MongoDbFactory

自定义创建一个MongoDbFactory用来替代Springboot为我们自动装配的MongoDbFactory,代码如下:

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.data.mongodb.MongoDbFactory;
  9. import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
  10. import com.mongodb.MongoClient;
  11. import com.mongodb.MongoClientOptions;
  12. import com.mongodb.MongoCredential;
  13. import com.mongodb.ServerAddress;
  14. @Configuration
  15. public class MongoConfig {
  16. private static final Logger logger = LoggerFactory.getLogger(MongoConfig.class);
  17. // 覆盖容器中默认的MongoDbFacotry Bean
  18. @Bean
  19. @Autowired
  20. public MongoDbFactory mongoDbFactory(MongoSettingsProperties properties) {
  21. // 客户端配置(连接数,副本集群验证)
  22. MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
  23. builder.connectionsPerHost(properties.getMaxConnectionsPerHost());
  24. builder.minConnectionsPerHost(properties.getMinConnectionsPerHost());
  25. if (properties.getReplicaSet() != null) {
  26. builder.requiredReplicaSetName(properties.getReplicaSet());
  27. }
  28. builder.threadsAllowedToBlockForConnectionMultiplier(
  29. properties.getThreadsAllowedToBlockForConnectionMultiplier());
  30. builder.serverSelectionTimeout(properties.getServerSelectionTimeout());
  31. builder.maxWaitTime(properties.getMaxWaitTime());
  32. builder.maxConnectionIdleTime(properties.getMaxConnectionIdleTime());
  33. builder.maxConnectionLifeTime(properties.getMaxConnectionLifeTime());
  34. builder.connectTimeout(properties.getConnectTimeout());
  35. builder.socketTimeout(properties.getSocketTimeout());
  36. // builder.socketKeepAlive(properties.getSocketKeepAlive());
  37. builder.sslEnabled(properties.getSslEnabled());
  38. builder.sslInvalidHostNameAllowed(properties.getSslInvalidHostNameAllowed());
  39. builder.alwaysUseMBeans(properties.getAlwaysUseMBeans());
  40. builder.heartbeatFrequency(properties.getHeartbeatFrequency());
  41. builder.minHeartbeatFrequency(properties.getMinHeartbeatFrequency());
  42. builder.heartbeatConnectTimeout(properties.getHeartbeatConnectTimeout());
  43. builder.heartbeatSocketTimeout(properties.getHeartbeatSocketTimeout());
  44. builder.localThreshold(properties.getLocalThreshold());
  45. MongoClientOptions mongoClientOptions = builder.build();
  46. // MongoDB地址列表
  47. List<ServerAddress> serverAddresses = new ArrayList<ServerAddress>();
  48. for (String address : properties.getAddress()) {
  49. String[] hostAndPort = address.split(":");
  50. String host = hostAndPort[0];
  51. Integer port = Integer.parseInt(hostAndPort[1]);
  52. ServerAddress serverAddress = new ServerAddress(host, port);
  53. serverAddresses.add(serverAddress);
  54. }
  55. logger.info("serverAddresses:" + serverAddresses.toString());
  56. // 连接认证
  57. // MongoCredential mongoCredential = null;
  58. // if (properties.getUsername() != null) {
  59. // mongoCredential = MongoCredential.createScramSha1Credential(
  60. // properties.getUsername(), properties.getAuthenticationDatabase() != null
  61. // ? properties.getAuthenticationDatabase() : properties.getDatabase(),
  62. // properties.getPassword().toCharArray());
  63. // }
  64. // 创建认证客户端
  65. // MongoClient mongoClient = new MongoClient(serverAddresses, mongoCredential, mongoClientOptions);
  66. // 创建非认证客户端
  67. MongoClient mongoClient = new MongoClient(serverAddresses, mongoClientOptions);
  68. // 创建MongoDbFactory
  69. MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, properties.getDatabase());
  70. return mongoDbFactory;
  71. }
  72. }

MongoDB测试

创建数据实体

  1. import java.io.Serializable;
  2. public class UserEntity implements Serializable {
  3. private static final long serialVersionUID = 1L;
  4. private Long id;
  5. private String userName;
  6. private String passWord;
  7. public Long getId() {
  8. return id;
  9. }
  10. public void setId(Long id) {
  11. this.id = id;
  12. }
  13. public String getUserName() {
  14. return userName;
  15. }
  16. public void setUserName(String userName) {
  17. this.userName = userName;
  18. }
  19. public String getPassWord() {
  20. return passWord;
  21. }
  22. public void setPassWord(String passWord) {
  23. this.passWord = passWord;
  24. }
  25. public String toString() {
  26. return "id: " + id + ",userName: " + userName + ",passWord: " + passWord;
  27. }
  28. }

创建Dao接口及实现

  1. public interface UserDao {
  2. void saveUser(UserEntity user);
  3. UserEntity findUserByName(String userName);
  4. }
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.data.mongodb.core.MongoTemplate;
  7. import org.springframework.data.mongodb.core.query.Criteria;
  8. import org.springframework.data.mongodb.core.query.Query;
  9. import org.springframework.stereotype.Component;
  10. @Component
  11. public class UserDaoImpl implements UserDao {
  12. @Autowired
  13. private MongoTemplate mongoTemplate;
  14. @Override
  15. public void saveUser(UserEntity user) {
  16. mongoTemplate.save(user);
  17. }
  18. @Override
  19. public UserEntity findUserByName(String userName) {
  20. Query query = new Query(Criteria.where("userName").is(userName));
  21. UserEntity user = mongoTemplate.findOne(query, UserEntity.class);
  22. return user;
  23. }
  24. }

编写测试代码

  1. import java.util.Optional;
  2. import org.junit.Test;
  3. import org.junit.runner.RunWith;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6. import org.springframework.data.domain.Example;
  7. import org.springframework.test.context.junit4.SpringRunner;
  8. import com.pengjunlee.UserDao;
  9. import com.pengjunlee.UserEntity;
  10. import com.pengjunlee.UserRepository;
  11. @RunWith(SpringRunner.class)
  12. @SpringBootTest
  13. public class MongoTest {
  14. @Autowired
  15. private UserDao userDao;
  16. @Autowired
  17. private UserRepository userRepository;
  18. @Test
  19. public void testSaveUser() {
  20. UserEntity user = new UserEntity();
  21. user.setId(88L);
  22. user.setUserName("XiaoMing");
  23. user.setPassWord("123456");
  24. userDao.saveUser(user);
  25. }
  26. @Test
  27. public void testFindUser01() {
  28. UserEntity user = userDao.findUserByName("XiaoMing");
  29. System.out.println(user);
  30. }
  31. @Test
  32. public void testFindUser02() {
  33. UserEntity queryUser = new UserEntity();
  34. queryUser.setUserName("XiaoMing");
  35. Example<UserEntity> example = Example.of(queryUser);
  36. Optional<UserEntity> optional = userRepository.findOne(example);
  37. System.out.println(optional.get());
  38. }
  39. }

查询结果:

id: 88,userName: XiaoMing,passWord: 123456

到此这篇关于SpringBoot中使用MongoDB的连接池配置的文章就介绍到这了,更多相关SpringBoot MongoDB连接池配置内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号