SpringBoot中使用MongoDB的連接池配置
在SpringBoot中,我們可以通過(guò)引入 spring-boot-starter-data-mongodb 依賴來(lái)實(shí)現(xiàn)spring-data-mongodb 的自動(dòng)配置。但是,默認(rèn)情況下,該依賴并沒(méi)有像使用MySQL或者Redis那樣為我們提供連接池配置的功能。因此,我們需要自行重寫(xiě) MongoDbFactory,實(shí)現(xiàn)MongoDB客戶端連接的參數(shù)配置擴(kuò)展。需要說(shuō)明的是,MongoDB的客戶端本身就是一個(gè)連接池,因此,我們只需要配置客戶端即可。
引入依賴
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
配置文件
為了方便對(duì)Mongodb進(jìn)行統(tǒng)一管理,我們將相關(guān)的配置抽取到 mongo-pool.properties 中,前綴為spring.data.mongodb(前綴可自己隨意配置):
spring.data.mongodb.address=172.16.250.234:27017,172.16.250.239:27017,172.16.250.240:27017 spring.data.mongodb.replica-set=rs0 spring.data.mongodb.database=test spring.data.mongodb.username=admin spring.data.mongodb.password=admin # Configure spring.data.mongodbDB Pool spring.data.mongodb.min-connections-per-host=10 spring.data.mongodb.max-connections-per-host=100 spring.data.mongodb.threads-allowed-to-block-for-connection-multiplier=5 spring.data.mongodb.server-selection-timeout=30000 spring.data.mongodb.max-wait-time=120000 spring.data.mongodb.max-connection-idel-time=0 spring.data.mongodb.max-connection-life-time=0 spring.data.mongodb.connect-timeout=10000 spring.data.mongodb.socket-timeout=0 spring.data.mongodb.socket-keep-alive=false spring.data.mongodb.ssl-enabled=false spring.data.mongodb.ssl-invalid-host-name-allowed=false spring.data.mongodb.always-use-m-beans=false spring.data.mongodb.heartbeat-socket-timeout=20000 spring.data.mongodb.heartbeat-connect-timeout=20000 spring.data.mongodb.min-heartbeat-frequency=500 spring.data.mongodb.heartbeat-frequency=10000 spring.data.mongodb.local-threshold=15 spring.data.mongodb.authentication-database=auth_dev
配置文件映射為JavaBean
為方便調(diào)用,將上述配置包裝成一個(gè)配置實(shí)體類,代碼如下:
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource(value = "classpath:mongo-pool.properties")
@ConfigurationProperties(prefix = "spring.data.mongodb")
public class MongoSettingsProperties {
private List<String> address;
private String replicaSet;
private String database;
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 heartbeatConnectTimeout = 20000;
private Integer heartbeatSocketTimeout = 20000;
private Integer minHeartbeatFrequency = 500;
private Integer heartbeatFrequency = 10000;
private Integer localThreshold = 15;
private String authenticationDatabase;
// 省略Getters和Setters方法
}
覆蓋MongoDbFactory
自定義創(chuàng)建一個(gè)MongoDbFactory用來(lái)替代Springboot為我們自動(dòng)裝配的MongoDbFactory,代碼如下:
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
@Configuration
public class MongoConfig {
private static final Logger logger = LoggerFactory.getLogger(MongoConfig.class);
// 覆蓋容器中默認(rèn)的MongoDbFacotry Bean
@Bean
@Autowired
public MongoDbFactory mongoDbFactory(MongoSettingsProperties properties) {
// 客戶端配置(連接數(shù),副本集群驗(yàn)證)
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.socketKeepAlive(properties.getSocketKeepAlive());
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<ServerAddress>();
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);
}
logger.info("serverAddresses:" + serverAddresses.toString());
// 連接認(rèn)證
// MongoCredential mongoCredential = null;
// if (properties.getUsername() != null) {
// mongoCredential = MongoCredential.createScramSha1Credential(
// properties.getUsername(), properties.getAuthenticationDatabase() != null
// ? properties.getAuthenticationDatabase() : properties.getDatabase(),
// properties.getPassword().toCharArray());
// }
// 創(chuàng)建認(rèn)證客戶端
// MongoClient mongoClient = new MongoClient(serverAddresses, mongoCredential, mongoClientOptions);
// 創(chuàng)建非認(rèn)證客戶端
MongoClient mongoClient = new MongoClient(serverAddresses, mongoClientOptions);
// 創(chuàng)建MongoDbFactory
MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, properties.getDatabase());
return mongoDbFactory;
}
}
MongoDB測(cè)試
創(chuàng)建數(shù)據(jù)實(shí)體
import java.io.Serializable;
public class UserEntity implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String userName;
private String passWord;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
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 String toString() {
return "id: " + id + ",userName: " + userName + ",passWord: " + passWord;
}
}
創(chuàng)建Dao接口及實(shí)現(xiàn)
public interface UserDao {
void saveUser(UserEntity user);
UserEntity findUserByName(String userName);
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
@Component
public class UserDaoImpl implements UserDao {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public void saveUser(UserEntity user) {
mongoTemplate.save(user);
}
@Override
public UserEntity findUserByName(String userName) {
Query query = new Query(Criteria.where("userName").is(userName));
UserEntity user = mongoTemplate.findOne(query, UserEntity.class);
return user;
}
}
編寫(xiě)測(cè)試代碼
import java.util.Optional;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Example;
import org.springframework.test.context.junit4.SpringRunner;
import com.pengjunlee.UserDao;
import com.pengjunlee.UserEntity;
import com.pengjunlee.UserRepository;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MongoTest {
@Autowired
private UserDao userDao;
@Autowired
private UserRepository userRepository;
@Test
public void testSaveUser() {
UserEntity user = new UserEntity();
user.setId(88L);
user.setUserName("XiaoMing");
user.setPassWord("123456");
userDao.saveUser(user);
}
@Test
public void testFindUser01() {
UserEntity user = userDao.findUserByName("XiaoMing");
System.out.println(user);
}
@Test
public void testFindUser02() {
UserEntity queryUser = new UserEntity();
queryUser.setUserName("XiaoMing");
Example<UserEntity> example = Example.of(queryUser);
Optional<UserEntity> optional = userRepository.findOne(example);
System.out.println(optional.get());
}
}
查詢結(jié)果:
id: 88,userName: XiaoMing,passWord: 123456
到此這篇關(guān)于SpringBoot中使用MongoDB的連接池配置的文章就介紹到這了,更多相關(guān)SpringBoot MongoDB連接池配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Feign遠(yuǎn)程調(diào)用Multipartfile參數(shù)處理
這篇文章主要介紹了Feign遠(yuǎn)程調(diào)用Multipartfile參數(shù)處理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
深入Ajax代理的Java Servlet的實(shí)現(xiàn)詳解
本篇文章是對(duì)Ajax代理的Java Servlet的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
jenkins自動(dòng)構(gòu)建SpringCloud流程
文章介紹了如何使用Jenkins和docker-compose自動(dòng)部署SpringCloud和Vue項(xiàng)目,首先,下載并安裝Jenkins,并配置Jenkins以自動(dòng)啟動(dòng),然后,配置GitLab插件和NodeJS插件,以便可以從GitLab倉(cāng)庫(kù)中獲取代碼并構(gòu)建,接下來(lái),創(chuàng)建一個(gè)Jenkins任務(wù)來(lái)構(gòu)建Vue項(xiàng)目2025-02-02
自定義application.yml配置項(xiàng)方式
這篇文章主要介紹了自定義application.yml配置項(xiàng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

