SpringBoot MongoDB 多數(shù)據(jù)源連接池配置

MongoDB 多數(shù)據(jù)源連接池配置

1.Config配置類

import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.SpringDataMongoDB;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;

import java.util.concurrent.TimeUnit;

/**
 * @author: curyu
 * @date: 2022/9/5 13:51
 * @description: mongodb連接池配置
 */
@Configuration
public class MongoConfiguration {

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.data.mongodb.primary")
    public MongoProperties masterMongoProperties() {
        return new MongoProperties();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.data.mongodb.second")
    public MongoProperties secondMongoProperties() {
        return new MongoProperties();
    }


    /**
     * 連接池自定義配置處理
     *
     * @return
     */
    @Bean
    @Primary
    public MongoDatabaseFactory mongoDatabaseFactory(@Qualifier("masterMongoProperties") MongoProperties properties) {
        MongoClientSettings.Builder builder = MongoClientSettings.builder();
        builder.applyConnectionString(new ConnectionString(properties.getUri()));
        builder.applyToConnectionPoolSettings(b -> {
            // 允許的最大連接數(shù)。這些連接在空閑時將保留在池中。一旦池耗盡,任何需要連接的操作都將阻塞等待可用連接 默認(rèn): 100
            b.maxSize(100);
            // 最小連接數(shù)。這些連接在空閑時將保留在池中,并且池將確保它至少包含這個最小數(shù)量 默認(rèn): 0
            b.minSize(5);
            // 池連接可以存活的最長時間。零值表示壽命沒有限制。超過其生命周期的池連接將被關(guān)閉并在必要時由新連接替換
            b.maxConnectionLifeTime(0, TimeUnit.SECONDS);
            // 池連接的最大空閑時間。零值表示對空閑時間沒有限制。超過其空閑時間的池連接將被關(guān)閉并在必要時由新連接替換
            b.maxConnectionIdleTime(5, TimeUnit.MINUTES);
            // 默認(rèn)最大連接時間120s;
            b.maxWaitTime(60000, TimeUnit.MILLISECONDS);
        });
        MongoClient mongoClient = MongoClients.create(builder.build(), SpringDataMongoDB.driverInformation());
        return new SimpleMongoClientDatabaseFactory(mongoClient, properties.getDatabase());
    }


    /**
     * 連接池自定義配置處理
     *
     * @return
     */
    @Bean
    public MongoDatabaseFactory secondMongoDatabaseFactory(@Qualifier("secondMongoProperties") MongoProperties properties) {
        MongoClientSettings.Builder builder = MongoClientSettings.builder();
        builder.applyConnectionString(new ConnectionString(properties.getUri()));
        builder.applyToConnectionPoolSettings(b -> {
            // 允許的最大連接數(shù)。這些連接在空閑時將保留在池中。一旦池耗盡,任何需要連接的操作都將阻塞等待可用連接 默認(rèn): 100
            b.maxSize(100);
            // 最小連接數(shù)。這些連接在空閑時將保留在池中,并且池將確保它至少包含這個最小數(shù)量 默認(rèn): 0
            b.minSize(5);
            // 池連接可以存活的最長時間。零值表示壽命沒有限制。超過其生命周期的池連接將被關(guān)閉并在必要時由新連接替換
            b.maxConnectionLifeTime(0, TimeUnit.SECONDS);
            // 池連接的最大空閑時間。零值表示對空閑時間沒有限制。超過其空閑時間的池連接將被關(guān)閉并在必要時由新連接替換
            b.maxConnectionIdleTime(5, TimeUnit.MINUTES);
            // 默認(rèn)最大連接時間120s;
            b.maxWaitTime(60000, TimeUnit.MILLISECONDS);
        });
        MongoClient mongoClient = MongoClients.create(builder.build(), SpringDataMongoDB.driverInformation());
        return new SimpleMongoClientDatabaseFactory(mongoClient, properties.getDatabase());
    }


    @Bean
    @Primary
    public MongoTemplate mongoTemplate(@Qualifier("mongoDatabaseFactory") MongoDatabaseFactory mongoDatabaseFactory) {
        MongoTemplate mongoTemplate = new MongoTemplate(mongoDatabaseFactory);
        //去除保存實體時,spring data mongodb 自動添加的_class字段
        MappingMongoConverter mongoMapping = (MappingMongoConverter) mongoTemplate.getConverter();
        mongoMapping.setTypeMapper(new DefaultMongoTypeMapper(null));
        mongoMapping.afterPropertiesSet();

        return mongoTemplate;

    }

    @Bean
    public MongoTemplate secondMongoTemplate(@Qualifier("secondMongoDatabaseFactory") MongoDatabaseFactory mongoDatabaseFactory) {
        MongoTemplate mongoTemplate = new MongoTemplate(mongoDatabaseFactory);
        //去除保存實體時,spring data mongodb 自動添加的_class字段
        MappingMongoConverter mongoMapping = (MappingMongoConverter) mongoTemplate.getConverter();
        mongoMapping.setTypeMapper(new DefaultMongoTypeMapper(null));
        mongoMapping.afterPropertiesSet();
        return mongoTemplate;

    }


}

2. 配置文件

spring:
  data:
    mongodb:
      # mongodb 默認(rèn)數(shù)據(jù)源
      primary:
        uri: mongodb://root:root@10.15.1.155:27017/${spring.data.mongodb.primary.database}?authSource=admin&authMechanism=SCRAM-SHA-1
        database: test-db

      # mongodb 第二數(shù)據(jù)源
      second:
        uri: mongodb://admin:admin123@10.15.1.156:27017/${spring.data.mongodb.second.database}?authSource=admin&authMechanism=SCRAM-SHA-1
        database: test2-db

3. 數(shù)據(jù)源測試


import com.mongodb.client.FindIterable;
import lombok.Data;
import org.bson.Document;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @author: curyu
 * @date: 2021/9/4 16:56
 * @description:
 */
@Data
@RunWith(SpringRunner.class)
@SpringBootTest
class MongoUtilTest {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Qualifier("secondMongoTemplate")
    @Autowired
    private MongoTemplate secondMongoTemplate;

    @Test
    void getById() {

        System.out.println(" mongo DataSource 1 ...");
        // 數(shù)據(jù)源1
        FindIterable<Document> cc = mongoTemplate.getCollection("order").find().limit(10);
        for (Document document : cc) {
            System.out.println(document);
        }

        System.out.println(" mongo DataSource 2 ...");
        // 數(shù)據(jù)源2
        FindIterable<Document> cc2 = secondMongoTemplate.getCollection("order2").find().limit(10);
        for (Document document : cc2) {
            System.out.println(document);
        }

    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容