好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SpringBoot中使用MongoDB的连接池配置

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

引入依赖

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

< 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 >

配置文件

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

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

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

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 );

 

  // 覆盖容器中默认的MongoDbFacotry Bean

  @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.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());

 

   // 连接认证

   // MongoCredential mongoCredential = null;

   // if (properties.getUsername() != null) {

   //  mongoCredential = MongoCredential.createScramSha1Credential(

   //    properties.getUsername(), properties.getAuthenticationDatabase() != null

   //      ? properties.getAuthenticationDatabase() : properties.getDatabase(),

   //    properties.getPassword().toCharArray());

   // }

 

   // 创建认证客户端

   // MongoClient mongoClient = new MongoClient(serverAddresses, mongoCredential, mongoClientOptions);

 

   // 创建非认证客户端

   MongoClient mongoClient = new MongoClient(serverAddresses, mongoClientOptions);

 

   // 创建MongoDbFactory

   MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, properties.getDatabase());

   return mongoDbFactory;

  }

}

MongoDB测试

创建数据实体

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

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;

  }

}

创建Dao接口及实现

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

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;

  }

}

编写测试代码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

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());

  }

}

查询结果:

id: 88,userName: XiaoMing,passWord: 123456

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

原文链接:https://blog.csdn.net/pengjunlee/article/details/84232582

查看更多关于SpringBoot中使用MongoDB的连接池配置的详细内容...

  阅读:28次