💡版本依赖

jdk 17

SpringBoot 3.1.0

Mongo 6.0.8

mybatis-plus 2.0.2

💡环境准备

🌵MongoDB安装

安装教程请查看:一文搞定(linux+windows+docker)安装MongoDB

🌵导入依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.1.0</version>
</parent>

<groupId>com.example</groupId>
<artifactId>springboot-mongo-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-mongo-demo</name>
<description>springboot-mongo-demo</description>
<properties>
    <java.version>17</java.version>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

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

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>2.0.32</version>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.15.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
    </dependency>
</dependencies>

🌵application.yml配置

server:
  port: 8080  # 设置访问端口

spring:
  data:
    mongodb:
      maxSize: 100 # 允许的最大连接数。这些连接在空闲时将保留在池中。一旦池耗尽,任何需要连接的操作都将阻塞等待可用连接 默认: 100
      minSize: 10 # 最小连接数。这些连接在空闲时将保留在池中,并且池将确保它至少包含这个最小数量 默认: 0
      maxConnectionLifeTime: 0 # 池连接可以存活的最长时间。零值表示寿命没有限制。超过其生命周期的池连接将被关闭并在必要时由新连接替换
      maxConnectionIdleTime: 5 # 池连接的最大空闲时间。零值表示对空闲时间没有限制。超过其空闲时间的池连接将被关闭并在必要时由新连接替换
      maxWaitTime: 60000 # 默认最大连接时间120s;
      one:
        uri: mongodb://47.98.123.147:27017/${spring.data.mongodb.one.database}
        database: mongo_db
        # 上方为明确指定某个数据的用户进行连接
        # 也可以使用admin 数据库中的用户进行连接  统一到admin 数据库进行认证
        # admin 用户认证 url 写法: mongodb://账户:密码%40@ip:端口/数据库名?authSource=admin&authMechanism=SCRAM-SHA-1
      two:
        uri: mongodb://47.98.123.147:27017/${spring.data.mongodb.two.database}
        database: mongo_db
        # 上方为明确指定某个数据的用户进行连接
        # 也可以使用admin 数据库中的用户进行连接  统一到admin 数据库进行认证
        # admin 用户认证 url 写法: mongodb://账户:密码%40@ip:端口/数据库名?authSource=admin&authMechanism=SCRAM-SHA-1

参数说明:

maxSize: 100 # 允许的最大连接数。这些连接在空闲时将保留在池中。一旦池耗尽,任何需要连接的操作都将阻塞等待可用连接 默认: 100
minSize: 10 # 最小连接数。这些连接在空闲时将保留在池中,并且池将确保它至少包含这个最小数量 默认: 0
maxConnectionLifeTime: 0 # 池连接可以存活的最长时间。零值表示寿命没有限制。超过其生命周期的池连接将被关闭并在必要时由新连接替换
maxConnectionIdleTime: 5 # 池连接的最大空闲时间。零值表示对空闲时间没有限制。超过其空闲时间的池连接将被关闭并在必要时由新连接替换
maxWaitTime: 60000 # 默认最大连接时间120s;

💡使用实例

🌵MongoConfiguration

/**
 * @author: coderJim
 * @description: mongodb连接池配置
 */
@Configuration
public class MongoConfiguration {


    @Value("${spring.data.mongodb.maxSize}")
    private int maxSize;

    @Value("${spring.data.mongodb.minSize}")
    private int minSize;

    @Value("${spring.data.mongodb.maxConnectionLifeTime}")
    private int maxConnectionLifeTime;

    @Value("${spring.data.mongodb.maxConnectionIdleTime}")
    private int maxConnectionIdleTime;

    @Value("${spring.data.mongodb.maxWaitTime}")
    private int maxWaitTime;

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

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


    /**
     * 连接池配置1
     *
     * @return
     */
    @Bean
    @Primary
    public MongoDatabaseFactory mongoDatabaseFactory(@Qualifier("masterMongoProperties") MongoProperties properties) {
        return getSimpleMongoClientDatabaseFactory(properties);
    }

    /**
     * 连接池配置2
     *
     * @return
     */
    @Bean
    public MongoDatabaseFactory twoMongoDatabaseFactory(@Qualifier("twoMongoProperties") MongoProperties properties) {
        return getSimpleMongoClientDatabaseFactory(properties);
    }

    private SimpleMongoClientDatabaseFactory getSimpleMongoClientDatabaseFactory(MongoProperties properties){
        MongoClientSettings.Builder builder = MongoClientSettings.builder();
        builder.applyConnectionString(new ConnectionString(properties.getUri()));
        builder.applyToConnectionPoolSettings(b -> {
            b.maxSize(maxSize);
            b.minSize(minSize);
            b.maxConnectionLifeTime(maxConnectionLifeTime, TimeUnit.SECONDS);
            b.maxConnectionIdleTime(maxConnectionIdleTime, TimeUnit.MINUTES);
            b.maxWaitTime(maxWaitTime, 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) {
        return getMongoTemplate(mongoDatabaseFactory);
    }

    @Bean
    public MongoTemplate twoMongoTemplate(@Qualifier("twoMongoDatabaseFactory") MongoDatabaseFactory mongoDatabaseFactory) {
        return getMongoTemplate(mongoDatabaseFactory);
    }

    private MongoTemplate getMongoTemplate(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;
    }
}

🌵User

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {

    private static final long serialVersionUID = -4328989516223829865L;
    /**
     * 用户ID
     */
    private String id;
    /**
     * 用户账号
     */
    private String userName;
    /**
     * 密码
     */
    private String password;

}

🌵MongoController

/**
 * mongo pool 实列
 * @author coderJim
 * @date 2023-05-15 00:03
 */
@RestController
@RequestMapping("/mongopool")
public class MongoController {

    @Autowired
    private MongoTemplate mongoTemplate;

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

    /**
     * 新增
     */
    @ResponseBody
    @GetMapping("/add")
    public void add(){

        User user = User.builder().id(UUID.randomUUID().toString()).userName("aa").password("111111").build();
        mongoTemplate.insert(user);
        User user2 = User.builder().id(UUID.randomUUID().toString()).userName("bb").password("2222").build();
        twoMongoTemplate.insert(user2);
    }
}

🎁如果需要完整源码请关注公众号"架构殿堂" ,回复 "SpringBoot+MongoDB配置连接池"即可获得

🔔写在最后

如果大家对相关文章感兴趣,可以关注公众号"架构殿堂",会持续更新AIGC,java基础面试题, netty, spring boot, spring cloud等系列文章,一系列干货随时送达!

08-08 10:33