最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot?整合mongoDB并自定義連接池的示例代碼

 更新時(shí)間:2022年02月25日 15:21:33   作者:上帝愛(ài)吃蘋果-  
這篇文章主要介紹了SpringBoot?整合mongoDB并自定義連接池?,整合mongoDB的目的就是想用它給我們提供的mongoTemplate,它可以很容易的操作mongoDB數(shù)據(jù)庫(kù),對(duì)整合過(guò)程及實(shí)例代碼感興趣的朋友跟隨小編一起看看吧

得力于SpringBoot的特性,整合mongoDB是很容易的,我們整合mongoDB的目的就是想用它給我們提供的mongoTemplate,它可以很容易的操作mongoDB數(shù)據(jù)庫(kù)。

為了自定義連接池,我們?cè)谂渲妙愔兄饕cMongoClientOptions、MongoCredential、MongoClient、MongoDbFactory打交道。最終的目的就是配置好一個(gè)MongoDbFactory的bean交由Spring管理。

Maven 依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

配置文件

mongodb:
  database: bfa_mongo
  username: "xxx"
  password: "xxxxx"
  address: "host:port"
  authenticationDatabase: [設(shè)置你的認(rèn)證數(shù)據(jù)庫(kù),如果有的話]
  # 連接池配置
  clientName: ${spring.application.name} # 客戶端的標(biāo)識(shí),用于定位請(qǐng)求來(lái)源等
  connectionTimeoutMs: 10000     # TCP連接超時(shí),毫秒
  readTimeoutMs: 15000       # TCP讀取超時(shí),毫秒
  poolMaxWaitTimeMs: 3000        #當(dāng)連接池?zé)o可用連接時(shí)客戶端阻塞等待的時(shí)長(zhǎng),單位毫秒
  connectionMaxIdleTimeMs: 60000   #TCP連接閑置時(shí)間,單位毫秒
  connectionMaxLifeTimeMs: 120000    #TCP連接最多可以使用多久,單位毫秒
  heartbeatFrequencyMs: 20000      #心跳檢測(cè)發(fā)送頻率,單位毫秒
  minHeartbeatFrequencyMs: 8000    #最小的心跳檢測(cè)發(fā)送頻率,單位毫秒
  heartbeatConnectionTimeoutMs: 10000  #心跳檢測(cè)TCP連接超時(shí),單位毫秒
  heartbeatReadTimeoutMs: 15000    #心跳檢測(cè)TCP連接讀取超時(shí),單位毫秒
  connectionsPerHost: 20       # 每個(gè)host的TCP連接數(shù)
  minConnectionsPerHost: 5     #每個(gè)host的最小TCP連接數(shù)
  #計(jì)算允許多少個(gè)線程阻塞等待可用TCP連接時(shí)的乘數(shù),算法:threadsAllowedToBlockForConnectionMultiplier*connectionsPerHost,當(dāng)前配置允許10*20個(gè)線程阻塞
  threadsAllowedToBlockForConnectionMultiplier: 10

注意:其中的address參數(shù)可以配置為一個(gè)數(shù)組(代表集群模式)

 address: 
    - "host:port"
    - "host2:port2"

MongoConfig配置類

配置類中使用了lombok,如果你沒(méi)有用lombok依賴和IDE插件,你要重寫getter、Setter方法:
代碼稍長(zhǎng),可以復(fù)制在IDEA中查看:

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 轉(zhuǎn)換器
     * @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) {
        //創(chuàng)建客戶端參數(shù)
        MongoClientOptions options = mongoClientOptions(properties);

        //創(chuàng)建客戶端和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);
        }

        //創(chuàng)建認(rèn)證客戶端
        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: 創(chuàng)建非認(rèn)證客戶端*/
        //MongoClient mongoClient = new MongoClient(serverAddresses, mongoClientOptions);
        return new SimpleMongoDbFactory(mongoClient, properties.getDatabase());
    }

    /**
     * mongo客戶端參數(shù)配置
     * @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 {

        /** 基礎(chǔ)連接參數(shù) */
        private String database;
        private String username;
        private String password;
        @NotNull
        private List<String> address;
        private String authenticationDatabase;

        /** 客戶端連接池參數(shù) */
        @NotNull
        @Size(min = 1)
        private String clientName;
        /** socket連接超時(shí)時(shí)間 */
        @Min(value = 1)
        private int connectionTimeoutMs;
        /** socket讀取超時(shí)時(shí)間 */
        @Min(value = 1)
        private int readTimeoutMs;
        /** 連接池獲取鏈接等待時(shí)間 */
        @Min(value = 1)
        private int poolMaxWaitTimeMs;
        /** 連接閑置時(shí)間 */
        @Min(value = 1)
        private int connectionMaxIdleTimeMs;
        /** 連接最多可以使用多久 */
        @Min(value = 1)
        private int connectionMaxLifeTimeMs;
        /** 心跳檢測(cè)發(fā)送頻率 */
        @Min(value = 2000)
        private int heartbeatFrequencyMs;

        /** 最小的心跳檢測(cè)發(fā)送頻率 */
        @Min(value = 300)
        private int minHeartbeatFrequencyMs;
        /** 計(jì)算允許多少個(gè)線程阻塞等待時(shí)的乘數(shù),算法:threadsAllowedToBlockForConnectionMultiplier*connectionsPerHost */
        @Min(value = 1)
        private int threadsAllowedToBlockForConnectionMultiplier;
        /** 心跳檢測(cè)連接超時(shí)時(shí)間 */
        @Min(value = 200)
        private int heartbeatConnectionTimeoutMs;
        /** 心跳檢測(cè)讀取超時(shí)時(shí)間 */
        @Min(value = 200)
        private int heartbeatReadTimeoutMs;

        /** 每個(gè)host最大連接數(shù) */
        @Min(value = 1)
        private int connectionsPerHost;
        /** 每個(gè)host的最小連接數(shù) */
        @Min(value = 1)
        private int minConnectionsPerHost;
    }
}

MappingMongoConverter可以自定義mongo轉(zhuǎn)換器,主要自定義存取mongo數(shù)據(jù)時(shí)的一些操作,例如 mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null)) 方法會(huì)將mongo數(shù)據(jù)中的_class字段去掉。

最后通過(guò) new SimpleMongoDbFactory(mongoClient, properties.getDatabase())方法配置了一個(gè)MongoDbFactory交由Spring管理,Springboot會(huì)拿這個(gè)MongoDbFactory工廠bean來(lái)new一個(gè)MongoTemplate,在MongoDbFactoryDependentConfiguration類下可以看到SpringBoot幫你做得事:

/**
 * 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創(chuàng)建MongoTemplate實(shí)例
	@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在配置類中生成一個(gè)MongoTemplate,之后我們就可以在項(xiàng)目代碼中直接@Autowired了。因?yàn)橛糜谏蒑ongoTemplate的MongoDbFactory是我們自己在MongoConfig配置類中生成的,所以我們自定義的連接池參數(shù)也就生效了。

到此這篇關(guān)于SpringBoot 整合mongoDB并自定義連接池的文章就介紹到這了,更多相關(guān)SpringBoot自定義連接池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mongodb使用索引進(jìn)行查詢優(yōu)化的操作方法

    Mongodb使用索引進(jìn)行查詢優(yōu)化的操作方法

    為集合建立合適的索引,能夠有效的減少查詢操作時(shí)掃描數(shù)據(jù)的數(shù)量 ,從而提高查詢效率,簡(jiǎn)化了mongodb內(nèi)部查詢工作,這篇文章主要介紹了Mongodb使用索引進(jìn)行查詢優(yōu)化的操作方法,需要的朋友可以參考下
    2024-06-06
  • MongoDB可視化工具mongodb-compass

    MongoDB可視化工具mongodb-compass

    這篇文章介紹了MongoDB的可視化工具mongodb-compass,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • MongoDB進(jìn)階之動(dòng)態(tài)字段設(shè)計(jì)詳解

    MongoDB進(jìn)階之動(dòng)態(tài)字段設(shè)計(jì)詳解

    這篇文章主要給大家介紹了MongoDB進(jìn)階之動(dòng)態(tài)字段設(shè)計(jì)的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • Java操作MongoDB數(shù)據(jù)庫(kù)方法詳解

    Java操作MongoDB數(shù)據(jù)庫(kù)方法詳解

    本文給大家分享的是使用Java操作MongoDB的一些基本方法,包含多種數(shù)據(jù)庫(kù)的連接方式,增刪改查等方法,非常的實(shí)用,有需要的小伙伴可以參考下
    2018-01-01
  • python實(shí)現(xiàn)爬蟲(chóng)數(shù)據(jù)存到 MongoDB

    python實(shí)現(xiàn)爬蟲(chóng)數(shù)據(jù)存到 MongoDB

    本文給大家分享的是使用python實(shí)現(xiàn)將爬蟲(chóng)爬到的數(shù)據(jù)存儲(chǔ)到mongoDB數(shù)據(jù)庫(kù)中的實(shí)例代碼,有需要的小伙伴可以參考下
    2016-09-09
  • 詳解MongoDB的條件查詢和排序

    詳解MongoDB的條件查詢和排序

    MongoDB 提供了豐富的查詢功能,包括條件組合、反向查詢、查詢結(jié)果過(guò)濾、排序等,借助 MongoDB 多樣化的查詢方式,可以完成業(yè)務(wù)上的各類查詢需要。
    2021-06-06
  • 教你使用MongoDB導(dǎo)入導(dǎo)出備份數(shù)據(jù)

    教你使用MongoDB導(dǎo)入導(dǎo)出備份數(shù)據(jù)

    這篇文章主要介紹了教你使用MongoDB導(dǎo)入導(dǎo)出備份數(shù)據(jù)方法的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • MongoDB高效讀寫海量數(shù)據(jù)的方法

    MongoDB高效讀寫海量數(shù)據(jù)的方法

    這篇文章介紹了MongoDB高效讀寫海量數(shù)據(jù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • MongoDB常用操作匯總

    MongoDB常用操作匯總

    MongoDB 是由C++語(yǔ)言編寫的,是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)。在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。MongoDB 旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
    2017-05-05
  • mongodb數(shù)據(jù)庫(kù)的6個(gè)安全設(shè)置命令

    mongodb數(shù)據(jù)庫(kù)的6個(gè)安全設(shè)置命令

    這篇文章主要介紹了mongodb數(shù)據(jù)庫(kù)的6個(gè)安全設(shè)置命令,如安全模式啟動(dòng)、安全認(rèn)證、數(shù)據(jù)讀寫加鎖、解鎖等,需要的朋友可以參考下
    2014-05-05

最新評(píng)論

三门县| 谢通门县| 北辰区| 惠州市| 绥滨县| 胶南市| 湟中县| 嘉兴市| 台北县| 博兴县| 扎鲁特旗| 浦县| 深州市| 天门市| 西昌市| 聊城市| 中阳县| 阿瓦提县| 泗水县| 沅陵县| 定襄县| 洛隆县| 密山市| 东阳市| 苍山县| 林州市| 武功县| 阳东县| 平山县| 香河县| 理塘县| 万州区| 梅州市| 定边县| 雅江县| 林西县| 南充市| 伊宁县| 馆陶县| 枞阳县| 宜兴市|