广告位联系
返回顶部
分享到

SpringBoot整合mongoDB并自定义连接池的示例代码

MongoDB 来源:互联网 作者:秩名 发布时间:2022-02-26 21:08:04 人浏览
摘要

得力于SpringBoot的特性,整合mongoDB是很容易的,我们整合mongoDB的目的就是想用它给我们提供的mongoTemplate,它可以很容易的操作mongoDB数据库。 为了自定义连接池,我们在配置类中主要与

得力于SpringBoot的特性,整合mongoDB是很容易的,我们整合mongoDB的目的就是想用它给我们提供的mongoTemplate,它可以很容易的操作mongoDB数据库。

为了自定义连接池,我们在配置类中主要与MongoClientOptions、MongoCredential、MongoClient、MongoDbFactory打交道。最终的目的就是配置好一个MongoDbFactory的bean交由Spring管理。

Maven 依赖

1

2

3

4

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-data-mongodb</artifactId>

</dependency>

配置文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

mongodb:

  database: bfa_mongo

  username: "xxx"

  password: "xxxxx"

  address: "host:port"

  authenticationDatabase: [设置你的认证数据库,如果有的话]

  # 连接池配置

  clientName: ${spring.application.name} # 客户端的标识,用于定位请求来源等

  connectionTimeoutMs: 10000     # TCP连接超时,毫秒

  readTimeoutMs: 15000       # TCP读取超时,毫秒

  poolMaxWaitTimeMs: 3000        #当连接池无可用连接时客户端阻塞等待的时长,单位毫秒

  connectionMaxIdleTimeMs: 60000   #TCP连接闲置时间,单位毫秒

  connectionMaxLifeTimeMs: 120000    #TCP连接最多可以使用多久,单位毫秒

  heartbeatFrequencyMs: 20000      #心跳检测发送频率,单位毫秒

  minHeartbeatFrequencyMs: 8000    #最小的心跳检测发送频率,单位毫秒

  heartbeatConnectionTimeoutMs: 10000  #心跳检测TCP连接超时,单位毫秒

  heartbeatReadTimeoutMs: 15000    #心跳检测TCP连接读取超时,单位毫秒

  connectionsPerHost: 20       # 每个host的TCP连接数

  minConnectionsPerHost: 5     #每个host的最小TCP连接数

  #计算允许多少个线程阻塞等待可用TCP连接时的乘数,算法:threadsAllowedToBlockForConnectionMultiplier*connectionsPerHost,当前配置允许10*20个线程阻塞

  threadsAllowedToBlockForConnectionMultiplier: 10

注意:其中的address参数可以配置为一个数组(代表集群模式)

1

2

3

address:

   - "host:port"

   - "host2:port2"

MongoConfig配置类

配置类中使用了lombok,如果你没有用lombok依赖和IDE插件,你要重写getter、Setter方法:
代码稍长,可以复制在IDEA中查看:

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

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

import com.mongodb.MongoClient;

import com.mongodb.MongoClientOptions;

import com.mongodb.MongoCredential;

import com.mongodb.ServerAddress;

import lombok.Getter;

import lombok.Setter;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.BeanFactory;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.boot.context.properties.EnableConfigurationProperties;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Primary;

import org.springframework.data.mongodb.MongoDbFactory;

import org.springframework.data.mongodb.core.SimpleMongoDbFactory;

import org.springframework.data.mongodb.core.convert.DbRefResolver;

import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;

import org.springframework.data.mongodb.core.convert.MappingMongoConverter;

import org.springframework.data.mongodb.core.convert.MongoCustomConversions;

import org.springframework.data.mongodb.core.mapping.MongoMappingContext;

import org.springframework.validation.annotation.Validated;

 

import javax.validation.constraints.Min;

import javax.validation.constraints.NotNull;

import javax.validation.constraints.Size;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

 

@Slf4j

@Configuration

@EnableConfigurationProperties(MongoConfig.MongoClientOptionProperties.class)

public class MongoConfig {

 

    /**

     * monogo 转换器

     * @return

     */

    @Bean

    public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory,

                                                       MongoMappingContext context, BeanFactory beanFactory, MongoCustomConversions conversions) {

        DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);

        MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);

        // remove _class field

//    mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));

        mappingConverter.setCustomConversions(conversions);

        return mappingConverter;

    }

 

    /**

     * 自定义mongo连接池

     * @param properties

     * @return

     */

    @Bean

    public MongoDbFactory mongoDbFactory(MongoClientOptionProperties properties) {

        //创建客户端参数

        MongoClientOptions options = mongoClientOptions(properties);

 

        //创建客户端和Factory

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

        }

 

        //创建认证客户端

        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, new ArrayList<>(Arrays.asList(mongoCredential)));

        }

        /** ps: 创建非认证客户端*/

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

        return new SimpleMongoDbFactory(mongoClient, properties.getDatabase());

    }

 

    /**

     * mongo客户端参数配置

     * @return

     */

    public MongoClientOptions mongoClientOptions(MongoClientOptionProperties properties) {

        return MongoClientOptions.builder()

                .connectTimeout(properties.getConnectionTimeoutMs())

                .socketTimeout(properties.getReadTimeoutMs()).applicationName(properties.getClientName())

                .heartbeatConnectTimeout(properties.getHeartbeatConnectionTimeoutMs())

                .heartbeatSocketTimeout(properties.getHeartbeatReadTimeoutMs())

                .heartbeatFrequency(properties.getHeartbeatFrequencyMs())

                .minHeartbeatFrequency(properties.getMinHeartbeatFrequencyMs())

                .maxConnectionIdleTime(properties.getConnectionMaxIdleTimeMs())

                .maxConnectionLifeTime(properties.getConnectionMaxLifeTimeMs())

                .maxWaitTime(properties.getPoolMaxWaitTimeMs())

                .connectionsPerHost(properties.getConnectionsPerHost())

                .threadsAllowedToBlockForConnectionMultiplier(

                        properties.getThreadsAllowedToBlockForConnectionMultiplier())

                .minConnectionsPerHost(properties.getMinConnectionsPerHost()).build();

    }

 

    @Getter

    @Setter

    @Validated

    @ConfigurationProperties(prefix = "mongodb")

    public static class MongoClientOptionProperties {

 

        /** 基础连接参数 */

        private String database;

        private String username;

        private String password;

        @NotNull

        private List<String> address;

        private String authenticationDatabase;

 

        /** 客户端连接池参数 */

        @NotNull

        @Size(min = 1)

        private String clientName;

        /** socket连接超时时间 */

        @Min(value = 1)

        private int connectionTimeoutMs;

        /** socket读取超时时间 */

        @Min(value = 1)

        private int readTimeoutMs;

        /** 连接池获取链接等待时间 */

        @Min(value = 1)

        private int poolMaxWaitTimeMs;

        /** 连接闲置时间 */

        @Min(value = 1)

        private int connectionMaxIdleTimeMs;

        /** 连接最多可以使用多久 */

        @Min(value = 1)

        private int connectionMaxLifeTimeMs;

        /** 心跳检测发送频率 */

        @Min(value = 2000)

        private int heartbeatFrequencyMs;

 

        /** 最小的心跳检测发送频率 */

        @Min(value = 300)

        private int minHeartbeatFrequencyMs;

        /** 计算允许多少个线程阻塞等待时的乘数,算法:threadsAllowedToBlockForConnectionMultiplier*connectionsPerHost */

        @Min(value = 1)

        private int threadsAllowedToBlockForConnectionMultiplier;

        /** 心跳检测连接超时时间 */

        @Min(value = 200)

        private int heartbeatConnectionTimeoutMs;

        /** 心跳检测读取超时时间 */

        @Min(value = 200)

        private int heartbeatReadTimeoutMs;

 

        /** 每个host最大连接数 */

        @Min(value = 1)

        private int connectionsPerHost;

        /** 每个host的最小连接数 */

        @Min(value = 1)

        private int minConnectionsPerHost;

    }

}

MappingMongoConverter可以自定义mongo转换器,主要自定义存取mongo数据时的一些操作,例如 mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null)) 方法会将mongo数据中的_class字段去掉。

最后通过 new SimpleMongoDbFactory(mongoClient, properties.getDatabase())方法配置了一个MongoDbFactory交由Spring管理,Springboot会拿这个MongoDbFactory工厂bean来new一个MongoTemplate,在MongoDbFactoryDependentConfiguration类下可以看到SpringBoot帮你做得事:

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

/**

 * Configuration for Mongo-related beans that depend on a {@link MongoDbFactory}.

 *

 * @author Andy Wilkinson

 */

@Configuration

@ConditionalOnBean(MongoDbFactory.class)

class MongoDbFactoryDependentConfiguration {

 

    private final MongoProperties properties;

    MongoDbFactoryDependentConfiguration(MongoProperties properties) {

        this.properties = properties;

    }

     

    //SpringBoot创建MongoTemplate实例

    @Bean

    @ConditionalOnMissingBean

    public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory, MongoConverter converter) {

        return new MongoTemplate(mongoDbFactory, converter);

    @ConditionalOnMissingBean(MongoConverter.class)

    public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context,

            MongoCustomConversions conversions) {

        DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);

        MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);

        mappingConverter.setCustomConversions(conversions);

        return mappingConverter;

     

    //...

}

SpringBoot利用我们配置好的MongoDbFactory在配置类中生成一个MongoTemplate,之后我们就可以在项目代码中直接@Autowired了。因为用于生成MongoTemplate的MongoDbFactory是我们自己在MongoConfig配置类中生成的,所以我们自定义的连接池参数也就生效了。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://www.cnblogs.com/keeya/p/11992267.html
相关文章
  • MongoDB实现创建删除数据库、创建删除表(集合

    MongoDB实现创建删除数据库、创建删除表(集合
    一、 数据库使用 开启 mongodb 服务:要管理数据库,必须先开启服务,开启服务使用 1 mongod --dbpath c:\mongodb 管理 mongodb 数据库:(一定要在新
  • MongoDB数据库基本概念介绍

    MongoDB数据库基本概念介绍
    不管我们要学习什么数据库,都应该学习其中的基础概念,在MongoDB中基本的概念是文档、集合、数据库,下面挨个介绍。 下面的表格将会帮
  • MongoDB连接和创建数据库的方法

    MongoDB连接和创建数据库的方法
    一、连接MongoDB 在连接MongoDB前确保启动MongoDB服务,只需要在MongoDB安装目录的bin目录下执行mongo.exe即可。 执行启动操作后,mongodb在输出一些
  • 使用MongoDB操作文档

    使用MongoDB操作文档
    本篇文章中将讲解如何使用MongoDB操作文档。 文档的数据结构和JSON基本一致,所有存储在集合中的数据都是BSON格式。BSON是一种类似json格式
  • Laravel框架中使用MongoDB数据库的操作

    Laravel框架中使用MongoDB数据库的操作
    1、先确定好自己使用的哪个版本的 Laravel 框架,再决定 composer 哪一个的 MongoDB,我使用的是 Laravel 8 所以我 composer 了 3.8 的MongoDb 2、执行
  • SpringBoot整合mongoDB并自定义连接池的示例代码
    得力于SpringBoot的特性,整合mongoDB是很容易的,我们整合mongoDB的目的就是想用它给我们提供的mongoTemplate,它可以很容易的操作mongoDB数据库。
  • 剖析后OpLog订阅MongoDB的数据变更就没那么难了

    剖析后OpLog订阅MongoDB的数据变更就没那么难了
    前言 我们开源了一个订阅分发mysql的binlog的项目,一直用的非常好,忽然有天开发说能不能支持MongoDB的数据订阅呢,MongoDB的使用度也挺广泛
  • MongoDB的备份与恢复的介绍
    任何数据库都离不开日常的备份与恢复,这二者是数据库安全的前提,MongoDB的备份与恢复方法一般而言都采用自带的工具来进行。 在开始讲
  • Oracle数据库下载与安装的完整步骤的介绍
    一、Oracle 数据库下载 访问 Oracle 数据库下载官网 选择目标版本数据库进行下载,本文以11gR2为例进行讲解。 访问Oracle 11gR2 下载官网https:/
  • 详解MongoDB操作符中的$elemMatch问题
    问题 如果MongoDB 数据库集合中仅存在一条记录 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 { _id : ObjectId( 5e6b4ef546b5f44e5c5b276d ), name : 赵小明 , us
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计