Spring Boot集成MongoDB及实战技巧与性能调优

Spring Boot集成MongoDB实战技巧与性能调优

一、集成步骤
  1. 添加依赖

    pom.xml中引入Spring Data MongoDB起步依赖:

    xml 复制代码
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
  2. 配置连接信息

    application.propertiesapplication.yml中配置MongoDB连接:

    properties 复制代码
    spring.data.mongodb.uri=mongodb://user:password@host:port/database
    # 或拆分配置
    spring.data.mongodb.host=localhost
    spring.data.mongodb.port=27017
    spring.data.mongodb.database=test
    spring.data.mongodb.username=user
    spring.data.mongodb.password=pass
  3. 实体类映射

    使用注解定义文档和字段映射:

    java 复制代码
    @Document(collection = "users") // 指定集合名
    public class User {
        @Id
        private String id;
        @Field("user_name") // 映射字段名
        private String username;
        @Indexed(unique = true) // 唯一索引
        private String email;
        private Date createTime;
    }
  4. Repository接口

    继承MongoRepository实现基础CRUD:

    java 复制代码
    public interface UserRepository extends MongoRepository<User, String> {
        // 自动生成查询方法
        List<User> findByUsername(String username);
        
        @Query("{ 'age' : { $gt: ?0 } }") // 自定义查询
        List<User> findUsersOlderThan(int age);
    }

二、实战技巧
  1. 索引优化

    • 单字段索引 :使用@Indexed注解。

    • 复合索引 :通过@CompoundIndex或在代码中创建:

      java 复制代码
      mongoTemplate.indexOps(User.class).ensureIndex(
          new Index().on("username", Sort.Direction.ASC)
                     .on("email", Sort.Direction.DESC)
      );
  2. 分页与排序

    使用Pageable实现分页查询:

    java 复制代码
    Page<User> users = userRepository.findAll(PageRequest.of(0, 10, Sort.by("createTime")));
  3. 事务支持(MongoDB 4.0+)

    • 确保MongoDB为副本集模式。

    • 在Spring Boot中启用事务:

      java 复制代码
      @Transactional
      public void updateUser(User user) {
          // 事务操作
      }
  4. 批量操作

    使用BulkOperations提升写入性能:

    java 复制代码
    BulkOperations bulkOps = mongoTemplate.bulkOps(BulkMode.ORDERED, User.class);
    bulkOps.insert(userList);
    bulkOps.execute();
  5. 读写分离

    配置ReadPreference将读请求路由到Secondary节点:

    java 复制代码
    @Bean
    public MongoTemplate mongoTemplate(MongoDatabaseFactory factory) {
        MongoTemplate template = new MongoTemplate(factory);
        template.setReadPreference(ReadPreference.secondaryPreferred());
        return template;
    }
  6. 投影优化

    减少返回字段,提升查询效率:

    java 复制代码
    Query query = new Query().addCriteria(Criteria.where("username").is("Alice"))
                             .fields().include("username").exclude("id");
    List<User> users = mongoTemplate.find(query, User.class);

三、性能调优
  1. 连接池配置

    调整连接池参数避免资源耗尽:

    properties 复制代码
    spring.data.mongodb.uri=mongodb://host:port/database?minPoolSize=10&maxPoolSize=100&maxIdleTimeMS=30000
  2. 监控慢查询

    • 启用MongoDB Profiling:

      javascript 复制代码
      db.setProfilingLevel(1, { slowms: 50 }) // 记录超过50ms的查询
    • 分析日志并优化索引或查询逻辑。

  3. 避免全集合扫描

    • 使用explain()分析查询计划,确保命中索引。
    • 避免在未索引字段上使用$regex$where
  4. 合理分片

    大数据量场景下,通过分片分散负载:

    javascript 复制代码
    sh.enableSharding("database")
    sh.shardCollection("database.users", { "userId": "hashed" })
  5. 文档结构设计

    • 内嵌文档:适合频繁访问的子数据(如用户地址)。
    • 引用关联:适合大型或频繁更新的子数据(如评论)。
  6. 缓存热点数据

    使用Redis或Spring Cache缓存高频查询结果:

    java 复制代码
    @Cacheable(value = "users", key = "#userId")
    public User getUserById(String userId) {
        return mongoTemplate.findById(userId, User.class);
    }

四、注意事项
  • 版本兼容性:确保Spring Boot版本与MongoDB驱动兼容(如Spring Boot 2.5+支持MongoDB 4.4+)。

  • 时区处理 :存储日期时明确时区,避免前端显示问题:

    java 复制代码
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
  • 乐观锁 :使用@Version避免并发冲突:

    java 复制代码
    @Version
    private Long version;

通过以上步骤与技巧,可高效集成MongoDB并优化应用性能。实际项目中需结合监控工具(如MongoDB Atlas、Spring Boot Actuator)持续分析调整。

相关推荐
小bo波42 分钟前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
用户3521802454752 小时前
🎆从 Prompt 到 Skill:让 Spring AI Agent 学会"装新技能"
人工智能·spring boot·ai编程
葫芦和十三11 小时前
图解 MongoDB 03|CRUD 全链路:一条 find 怎么穿过 WiredTiger
后端·mongodb·agent
葫芦和十三19 小时前
图解 MongoDB 04|索引模型:每建一个索引,就是在 B+-tree 森林里多栽一棵
后端·mongodb·agent
nanxun8861 天前
记一次诡异的 Docker 容器"串包"故障排查
java
用户1563068103511 天前
Day01 | Java 基础(Java SE)
java
行者全栈架构师1 天前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师1 天前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_01 天前
mac(m5)平台编译openjdk
java
葫芦和十三2 天前
图解 MongoDB 02|BSON:你以为存的是 JSON,其实是带类型的二进制
后端·mongodb·agent