• Springboot 集成 mongodb


    一、引入依赖
    1.1 Maven

    1.  <dependency>
    2.      <groupId>org.springframework.bootgroupId>
    3.      <artifactId>spring-boot-starter-data-mongodbartifactId>
    4. dependency>


    二、yml 配置文件

    1. data:
    2.   mongodb:
    3.     # 基础链接参数
    4.     # 连接的库
    5.     database: mongodb
    6.     # 用户名
    7.     username: mongodb
    8.     # 密码
    9.     password: mongodb
    10.     # IP和端口(host:port),例如127.0.0.1:27017。集群模式用,分隔开,例如host1:port1,host2:port2
    11.     address: 192.168.1.1:3717,192.168.1.2:3717
    12.     # 设置认证数据库,如果有的话
    13.     authenticationDatabase: 
    14.     # 客户端连接池参数
    15.     clientName: ${spring.application.name}
    16.     # TCP(socket)连接超时时间,毫秒
    17.     connectionTimeoutMs: 5000
    18.     # TCP(socket)连接闲置时间,毫秒
    19.     maxConnectionIdleTimeMs: 60000
    20.     # TCP(socket)连接最多可以使用多久,毫秒
    21.     maxConnectionLifeTimeMs: 300000
    22.     #TCP(socket)读取超时时间,毫秒
    23.     readTimeoutMs: 15000
    24.     #心跳检测发送频率,毫秒
    25.     heartbeatFrequencyMs: 20000
    26.     #线程池允许的最大连接数
    27.     connectionsPerHost: 100
    28.     #线程池空闲时保持的最小连接数
    29.     minConnectionsPerHost: 20

    三、MongoConfig配置类
    部分可以配置可以查看源代码 AbstractMongoClientConfiguration 类

    1. @Configuration
    2. @EnableConfigurationProperties(MongoConfig.MongoClientOptionProperties.class)
    3. @Slf4j
    4. public class MongoConfig {
    5.  
    6.     /**
    7.      * 转换器
    8.      * MappingMongoConverter可以自定义mongo转换器,主要自定义存取mongo数据时的一些操作,例如 mappingConverter.setTypeMapper(new
    9.      * DefaultMongoTypeMapper(null)) 方法会将mongo数据中的_class字段去掉。
    10.      *
    11.      * @param factory     mongo工厂
    12.      * @param context     上下文
    13.      * @param beanFactory 自定义转换器
    14.      * @return 转换器对象
    15.      */
    16.     @Bean
    17.     public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory factory, MongoMappingContext context, BeanFactory beanFactory) {
    18.         DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
    19.         MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);
    20.         try {
    21.             mappingConverter.setCustomConversions(beanFactory.getBean(CustomConversions.class));
    22.         } catch (NoSuchBeanDefinitionException ignore) {
    23.  
    24.         }
    25.  
    26.         // 保存不需要 _class to 字段 mongo
    27.         mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
    28.  
    29.         return mappingConverter;
    30.     }
    31.  
    32.     @Bean
    33.     public MongoTypeMapper defaultMongoTypeMapper() {
    34.         return new DefaultMongoTypeMapper(null);
    35.     }
    36.  
    37.     /**
    38.      * 此Bean也是可以不显示定义的,如果我们没有显示定义生成MongoTemplate实例,
    39.      * SpringBoot利用我们配置好的MongoDbFactory在配置类中生成一个MongoTemplate,
    40.      * 之后我们就可以在项目代码中直接@Autowired了。因为用于生成MongoTemplate
    41.      * 的MongoDbFactory是我们自己在MongoConfig配置类中生成的,所以我们自定义的连接池参数也就生效了。
    42.      *
    43.      * @param mongoDbFactory mongo工厂
    44.      * @param converter      转换器
    45.      * @return MongoTemplate实例
    46.      */
    47.     @Bean
    48.     public MongoTemplate mongoTemplate(MongoDatabaseFactory mongoDbFactory, MappingMongoConverter converter) {
    49.         MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter);
    50.         // 设置读从库优先
    51.         mongoTemplate.setReadPreference(ReadPreference.secondaryPreferred());
    52.         return mongoTemplate;
    53.     }
    54.  
    55.     /**
    56.      * 自定义mongo连接池
    57.      *
    58.      * @param properties 属性配置类
    59.      * @return MongoDbFactory对象
    60.      */
    61.     @Bean
    62.     public MongoDatabaseFactory mongoDbFactory(MongoClientOptionProperties properties) {
    63.         // 创建客户端参数
    64.         MongoClientSettings mongoClientOptions = mongoClientSettings(properties);
    65.  
    66.         // Mongo Client
    67.         MongoDriverInformation info = MongoDriverInformation.builder().build();
    68.  
    69.         MongoClient mongoClient = new MongoClientImpl(mongoClientOptions, info);
    70.  
    71.         return new SimpleMongoClientDatabaseFactory(mongoClient, properties.database);
    72.     }
    73.  
    74.     @Bean
    75.     public MongoClientSettings mongoClientSettings(MongoClientOptionProperties properties) {
    76.         // 创建认证
    77.         MongoCredential mongoCredential = getCredential(properties);
    78.         // 解析获取mongo服务地址
    79.         List serverAddressList = getServerAddress(properties.getAddress());
    80.  
    81.         return MongoClientSettings.builder()
    82.                 //#客户端的标识,用于定位请求来源等,一般用程序名
    83.                 .applicationName(properties.clientName)
    84.                 //配置IP地址
    85.                 .applyToClusterSettings(i -> i.hosts(serverAddressList))
    86.                 //配置认证
    87.                 .credential(mongoCredential)
    88.  
    89.                 .applyToSocketSettings(i -> i
    90.                         //TCP(socket)读取超时时间,毫秒
    91.                         .readTimeout(properties.readTimeoutMs, TimeUnit.MILLISECONDS)
    92.                         //TCP(socket)连接超时时间,毫秒
    93.                         .connectTimeout(properties.connectionTimeoutMs, TimeUnit.MILLISECONDS))
    94.  
    95.                 .applyToConnectionPoolSettings(i -> i
    96.                         //TCP(socket)连接闲置时间,毫秒
    97.                         .maxConnectionIdleTime(properties.maxConnectionIdleTimeMs, TimeUnit.MILLISECONDS)
    98.                         //TCP(socket)连接最多可以使用多久,毫秒
    99.                         .maxConnectionLifeTime(properties.maxConnectionIdleTimeMs, TimeUnit.MILLISECONDS)
    100.                         //当连接池无可用连接时客户端阻塞等待的最大时长,毫秒
    101.                         .maxWaitTime(properties.maxWaitTimeMs, TimeUnit.MILLISECONDS)
    102.                         .maxSize(properties.connectionsPerHost)
    103.                         .minSize(properties.minConnectionsPerHost))
    104.  
    105.                 .applyToServerSettings(i -> i
    106.                         .heartbeatFrequency(properties.heartbeatFrequencyMs, TimeUnit.MILLISECONDS)
    107.                         .minHeartbeatFrequency(properties.minHeartbeatFrequencyMs, TimeUnit.MILLISECONDS))
    108.  
    109.  
    110.                 .build();
    111.     }
    112.  
    113.     /**
    114.      * 创建认证
    115.      *
    116.      * @param properties 属性配置类
    117.      * @return 认证对象
    118.      */
    119.     private MongoCredential getCredential(MongoClientOptionProperties properties) {
    120.         if (!StringUtils.isEmpty(properties.getUsername()) && !StringUtils.isEmpty(properties.getPassword())) {
    121.             // 没有专用认证数据库则取当前数据库
    122.             String database = StringUtils.isEmpty(properties.getAuthenticationDatabase()) ?
    123.                     properties.getDatabase() : properties.getAuthenticationDatabase();
    124.             return MongoCredential.createCredential(properties.getUsername(), database,
    125.                     properties.getPassword().toCharArray());
    126.         }
    127.         return null;
    128.     }
    129.  
    130.     /**
    131.      * 获取数据库服务地址
    132.      *
    133.      * @param mongoAddress 地址字符串
    134.      * @return 服务地址数组
    135.      */
    136.     private List getServerAddress(String mongoAddress) {
    137.         String[] mongoAddressArray = mongoAddress.trim().split(",");
    138.         List serverAddressList = new ArrayList<>(4);
    139.         for (String address : mongoAddressArray) {
    140.             String[] hostAndPort = address.split(":");
    141.             serverAddressList.add(new ServerAddress(hostAndPort[0], Integer.parseInt(hostAndPort[1])));
    142.         }
    143.         return serverAddressList;
    144.     }
    145.  
    146.     @Setter
    147.     @Getter
    148.     @Accessors(chain = true)
    149.     @ConfigurationProperties(prefix = "data.mongodb")
    150.     public class MongoClientOptionProperties {
    151.         /**
    152.          * 基础连接参数
    153.          */
    154.         // 要连接的数据库
    155.         @NotEmpty
    156.         private String database;
    157.         // 用户名
    158.         private String username;
    159.         // 密码
    160.         private String password;
    161.         // IP和端口(host:port),例如127.0.0.1:27017。集群模式用,分隔开,例如host1:port1,host2:port2
    162.         //@NotEmpty
    163.         private String address;
    164.         // 设置认证数据库,如果有的话
    165.         private String authenticationDatabase;
    166.  
    167.         /**
    168.          * 客户端连接池参数
    169.          */
    170.         @NotEmpty
    171.         private String clientName; // 客户端的标识,用于定位请求来源等,一般用程序名
    172.         @Min(value = 1)
    173.         private int connectionTimeoutMs; // TCP(socket)连接超时时间,毫秒
    174.         @Min(value = 1)
    175.         private int maxConnectionIdleTimeMs; // TCP(socket)连接闲置时间,毫秒
    176.         @Min(value = 1)
    177.         private int maxConnectionLifeTimeMs; // TCP(socket)连接最多可以使用多久,毫秒
    178.         @Min(value = 1)
    179.         private int readTimeoutMs; // TCP(socket)读取超时时间,毫秒
    180.         @Min(value = 1)
    181.         private int maxWaitTimeMs; // 当连接池无可用连接时客户端阻塞等待的最大时长,毫秒
    182.         @Min(value = 2000)
    183.         private int heartbeatFrequencyMs; // 心跳检测发送频率,毫秒
    184.         @Min(value = 300)
    185.         private int minHeartbeatFrequencyMs; // 最小的心跳检测发送频率,毫秒
    186.         @Min(value = 200)
    187.         private int heartbeatConnectionTimeoutMs; // 心跳检测连接超时时间,毫秒
    188.         @Min(value = 200)
    189.         private int heartbeatReadTimeoutMs; // 心跳检测读取超时时间,毫秒
    190.         @Min(value = 1)
    191.         private int connectionsPerHost; // 线程池允许的最大连接数
    192.         @Min(value = 1)
    193.         private int minConnectionsPerHost; // 线程池空闲时保持的最小连接数
    194.         @Min(value = 1)
    195.         // 计算允许多少个线程阻塞等待时的乘数,算法:threadsAllowedToBlockForConnectionMultiplier*maxConnectionsPerHost
    196.         private int threadsAllowedToBlockForConnectionMultiplier;

  • 相关阅读:
    计算机视觉(CV)技术的优势和挑战
    智能语法编辑器市场现状及未来发展趋势分析
    Android 使用 registerForActivityResult() 打开系统相册或相机获取图像
    手机银行APP评测系列:天津银行持续优化手机银行用户体验,但仍需加强细节提升
    【程序猿保健】ShaderJoy —— 拉力带教程
    对paddleOCR中的字符识别模型转ONNX
    第23天中视频伙伴计划通过!分享本人心得,希望能帮到路上的你
    SpringBoot 接口数据加解密技巧
    Redis系列:数据持久化提高可用性
    Metabase学习教程:视图-4
  • 原文地址:https://blog.csdn.net/weixin_43837268/article/details/134271752