Spring Boot配置MongoDB连接池

匿名 (未验证) 提交于 2019-12-03 00:22:01

因为Spring Boot中默认没有提供配置MongoDB连接池的属性,所以需要自己向Spring容器中注入mongoDbFactory

1. 添加依赖

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies>     <!-- .. -->     <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> </dependencies>

2. 在配置文件中添加属性

application.properties中或者自定义的属性文件中添加属性。

# 这里添加在了application.properties中 mongo.address=localhost:27001,localhost:27002,localhost:27003 mongo.replica-set=reolicaName mongo.database=databaseName mongo.username=sherry mongo.password=123456 mongo.options.min-connections-per-host=20 mongo.options.max-connections-per-host=20 mongo.options.threads-allowed-to-block-for-connection-multiplier=5 mongo.options.server-selection-timeout=30000 mongo.options.max-wait-time=120000 mongo.options.max-connection-idel-time=0 mongo.options.max-connection-life-time=0 mongo.options.connect-timeout=10000 mongo.options.socket-timeout=0 mongo.options.socket-keep-alive=false mongo.options.ssl-enabled=false mongo.options.ssl-invalid-host-name-allowed=false mongo.options.always-use-m-beans=false mongo.options.heartbeat-socket-timeout=20000 mongo.options.heartbeat-connect-timeout=20000 mongo.options.min-heartbeat-frequency=500 mongo.options.heartbeat-frequency=10000 mongo.options.local-threshold=15

3. 把配置文件映射为Java Bean

@Component @Validated @PropertySource(value = "classpath:application.properties") @ConfigurationProperties(prefix = "mongo") public class MongoSettingsProperties { @NotBlank private String database; @NotEmpty private List<String> address; private String replicaSet; private String username; private String password; private Integer minConnectionsPerHost = 0; private Integer maxConnectionsPerHost = 100; private Integer threadsAllowedToBlockForConnectionMultiplier = 5; private Integer serverSelectionTimeout = 30000; private Integer maxWaitTime = 120000; private Integer maxConnectionIdleTime = 0; private Integer maxConnectionLifeTime = 0; private Integer connectTimeout = 10000; private Integer socketTimeout = 0; private Boolean socketKeepAlive = false; private Boolean sslEnabled = false; private Boolean sslInvalidHostNameAllowed = false; private Boolean alwaysUseMBeans = false; private Integer heartbeatFrequency = 10000; private Integer minHeartbeatFrequency = 500; private Integer heartbeatConnectTimeout = 20000; private Integer heartbeatSocketTimeout = 20000; private Integer localThreshold = 15; private String authenticationDatabase;  public MongoSettingsProperties() { }  public String getDatabase() { return database;   public void setDatabase(String database) { this.database = database;   public String getReplicaSet() { return replicaSet;   public void setReplicaSet(String replicaSet) { this.replicaSet = replicaSet;   public String getUsername() { return username;   public void setUsername(String username) { this.username = username;   public String getPassword() { return password;   public void setPassword(String password) { this.password = password;    public Integer getMinConnectionsPerHost() { return minConnectionsPerHost;   public void setMinConnectionsPerHost(Integer minConnectionsPerHost) { this.minConnectionsPerHost = minConnectionsPerHost;   public List<String> getAddress() { return address;   public void setAddress(List<String> address) { this.address = address;   public Integer getMaxConnectionsPerHost() { return maxConnectionsPerHost;   public void setMaxConnectionsPerHost(Integer maxConnectionsPerHost) { this.maxConnectionsPerHost = maxConnectionsPerHost;   public Integer getThreadsAllowedToBlockForConnectionMultiplier() { return threadsAllowedToBlockForConnectionMultiplier;   public void setThreadsAllowedToBlockForConnectionMultiplier(Integer threadsAllowedToBlockForConnectionMultiplier) { this.threadsAllowedToBlockForConnectionMultiplier = threadsAllowedToBlockForConnectionMultiplier;   public Integer getServerSelectionTimeout() { return serverSelectionTimeout;   public void setServerSelectionTimeout(Integer serverSelectionTimeout) { this.serverSelectionTimeout = serverSelectionTimeout;   public Integer getMaxWaitTime() { return maxWaitTime;   public void setMaxWaitTime(Integer maxWaitTime) { this.maxWaitTime = maxWaitTime;   public Integer getMaxConnectionIdleTime() { return maxConnectionIdleTime;   public void setMaxConnectionIdleTime(Integer maxConnectionIdleTime) { this.maxConnectionIdleTime = maxConnectionIdleTime;   public Integer getMaxConnectionLifeTime() { return maxConnectionLifeTime;   public void setMaxConnectionLifeTime(Integer maxConnectionLifeTime) { this.maxConnectionLifeTime = maxConnectionLifeTime;   public Integer getConnectTimeout() { return connectTimeout;   public void setConnectTimeout(Integer connectTimeout) { this.connectTimeout = connectTimeout;   public Integer getSocketTimeout() { return socketTimeout;   public void setSocketTimeout(Integer socketTimeout) { this.socketTimeout = socketTimeout;   public Boolean getSocketKeepAlive() { return socketKeepAlive;   public void setSocketKeepAlive(Boolean socketKeepAlive) { this.socketKeepAlive = socketKeepAlive;   public Boolean getSslEnabled() { return sslEnabled;   public void setSslEnabled(Boolean sslEnabled) { this.sslEnabled = sslEnabled;   public Boolean getSslInvalidHostNameAllowed() { return sslInvalidHostNameAllowed;   public void setSslInvalidHostNameAllowed(Boolean sslInvalidHostNameAllowed) { this.sslInvalidHostNameAllowed = sslInvalidHostNameAllowed;   public Boolean getAlwaysUseMBeans() { return alwaysUseMBeans;   public void setAlwaysUseMBeans(Boolean alwaysUseMBeans) { this.alwaysUseMBeans = alwaysUseMBeans;   public Integer getHeartbeatFrequency() { return heartbeatFrequency;   public void setHeartbeatFrequency(Integer heartbeatFrequency) { this.heartbeatFrequency = heartbeatFrequency;   public Integer getMinHeartbeatFrequency() { return minHeartbeatFrequency;   public void setMinHeartbeatFrequency(Integer minHeartbeatFrequency) { this.minHeartbeatFrequency = minHeartbeatFrequency;   public Integer getHeartbeatConnectTimeout() { return heartbeatConnectTimeout;   public void setHeartbeatConnectTimeout(Integer heartbeatConnectTimeout) { this.heartbeatConnectTimeout = heartbeatConnectTimeout;   public Integer getHeartbeatSocketTimeout() { return heartbeatSocketTimeout;   public void setHeartbeatSocketTimeout(Integer heartbeatSocketTimeout) { this.heartbeatSocketTimeout = heartbeatSocketTimeout;   public Integer getLocalThreshold() { return localThreshold;   public void setLocalThreshold(Integer localThreshold) { this.localThreshold = localThreshold;   public String getAuthenticationDatabase() { return authenticationDatabase;   public void setAuthenticationDatabase(String authenticationDatabase) { this.authenticationDatabase = authenticationDatabase;  }

4. 配置mongoDbFactory并向spring容器中注入

 @Configuration public class MongoConfig {  //覆盖默认的MongoDbFacotry @Bean @Autowired public MongoDbFactory mongoDbFactory(MongoSettingsProperties properties) { //客户端配置(连接数,副本集群验证) MongoClientOptions.Builder builder = new MongoClientOptions.Builder(); builder.connectionsPerHost(properties.getMaxConnectionsPerHost()); builder.minConnectionsPerHost(properties.getMinConnectionsPerHost()); if (properties.getReplicaSet() != null) { builder.requiredReplicaSetName(properties.getReplicaSet());                 builder.threadsAllowedToBlockForConnectionMultiplier( properties.getThreadsAllowedToBlockForConnectionMultiplier()); builder.serverSelectionTimeout(properties.getServerSelectionTimeout()); builder.maxWaitTime(properties.getMaxWaitTime()); builder.maxConnectionIdleTime(properties.getMaxConnectionIdleTime()); builder.maxConnectionLifeTime(properties.getMaxConnectionLifeTime()); builder.connectTimeout(properties.getConnectTimeout()); builder.socketTimeout(properties.getSocketTimeout());  builder.sslEnabled(properties.getSslEnabled()); builder.sslInvalidHostNameAllowed(properties.getSslInvalidHostNameAllowed()); builder.alwaysUseMBeans(properties.getAlwaysUseMBeans()); builder.heartbeatFrequency(properties.getHeartbeatFrequency()); builder.minHeartbeatFrequency(properties.getMinHeartbeatFrequency()); builder.heartbeatConnectTimeout(properties.getHeartbeatConnectTimeout()); builder.heartbeatSocketTimeout(properties.getHeartbeatSocketTimeout()); builder.localThreshold(properties.getLocalThreshold());  MongoClientOptions mongoClientOptions = builder.build();   // MongoDB地址列表 List<ServerAddress> serverAddresses = new ArrayList<>(); for (String address : properties.getAddress()) { String[] hostAndPort = address.split(":"); String host = hostAndPort[0]; Integer port = Integer.parseInt(hostAndPort[1]);  ServerAddress serverAddress = new ServerAddress(host, port); serverAddresses.add(serverAddress);  //System.out.println("serverAddresses:" + serverAddresses.toString());  // 连接认证 MongoCredential mongoCredential = MongoCredential.createScramSha1Credential(properties.getUsername(), properties.getAuthenticationDatabase() != null ? properties.getAuthenticationDatabase() : properties.getDatabase(), properties.getPassword().toCharArray());   //创建客户端和Factory MongoClient mongoClient = new MongoClient(serverAddresses, mongoCredential, mongoClientOptions); MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, properties.getDatabase());  return mongoDbFactory;  }

5. 使用MongoTemplate

配置完MongoDbFactory后就可以使用MongoTemplate了。

 public class MongoService { @Autowired private MongoTemplate mongoTemplate;  //.. }

或者继承MongoRepository

@Repository public interface DemoRepository extends MongoRepository<Speech, String> { }

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!