当前位置: 首页 > news >正文

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

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

一、集成步骤
  1. 添加依赖
    pom.xml中引入Spring Data MongoDB起步依赖:

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    
  2. 配置连接信息
    application.propertiesapplication.yml中配置MongoDB连接:

    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. 实体类映射
    使用注解定义文档和字段映射:

    @Document(collection = "users") // 指定集合名
    public class User {@Idprivate String id;@Field("user_name") // 映射字段名private String username;@Indexed(unique = true) // 唯一索引private String email;private Date createTime;
    }
    
  4. Repository接口
    继承MongoRepository实现基础CRUD:

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

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

    • 单字段索引:使用@Indexed注解。
    • 复合索引:通过@CompoundIndex或在代码中创建:
      mongoTemplate.indexOps(User.class).ensureIndex(new Index().on("username", Sort.Direction.ASC).on("email", Sort.Direction.DESC)
      );
      
  2. 分页与排序
    使用Pageable实现分页查询:

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

    • 确保MongoDB为副本集模式。
    • 在Spring Boot中启用事务:
      @Transactional
      public void updateUser(User user) {// 事务操作
      }
      
  4. 批量操作
    使用BulkOperations提升写入性能:

    BulkOperations bulkOps = mongoTemplate.bulkOps(BulkMode.ORDERED, User.class);
    bulkOps.insert(userList);
    bulkOps.execute();
    
  5. 读写分离
    配置ReadPreference将读请求路由到Secondary节点:

    @Bean
    public MongoTemplate mongoTemplate(MongoDatabaseFactory factory) {MongoTemplate template = new MongoTemplate(factory);template.setReadPreference(ReadPreference.secondaryPreferred());return template;
    }
    
  6. 投影优化
    减少返回字段,提升查询效率:

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

三、性能调优
  1. 连接池配置
    调整连接池参数避免资源耗尽:

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

    • 启用MongoDB Profiling:
      db.setProfilingLevel(1, { slowms: 50 }) // 记录超过50ms的查询
      
    • 分析日志并优化索引或查询逻辑。
  3. 避免全集合扫描

    • 使用explain()分析查询计划,确保命中索引。
    • 避免在未索引字段上使用$regex$where
  4. 合理分片
    大数据量场景下,通过分片分散负载:

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

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

    @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+)。
  • 时区处理:存储日期时明确时区,避免前端显示问题:
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    
  • 乐观锁:使用@Version避免并发冲突:
    @Version
    private Long version;
    

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

相关文章:

  • android framework开发的技能要求
  • 哈希表实现
  • 微前端框架 Wujie
  • python3GUI--仿网课答题播放器 By:PyQt5(分享)
  • System.out 详解
  • ts与面向对象
  • trivy开源安全漏洞扫描器——筑梦之路
  • 操作系统:进程是一个非常重要的抽象概念
  • QML 样式库
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用类尺寸QSizeF)
  • Java发生OOM是否必然导致JVM退出
  • 【工具变量】A股上市企业数据资产披露水平数据集(2000-2023年)
  • 8.QT-按钮类控件|Push Button|Radio Button|Check Box|Tool Button(C++)
  • 提交bug单时,应该说明哪些信息?
  • 强制重装及验证onnxruntime-gpu是否正确工作
  • 借助 OpenCV 和 PyTorch 库,利用卷积神经网络提取图像边缘特征
  • C++项目 —— 基于多设计模式下的同步异步日志系统(4)(双缓冲区异步任务处理器(AsyncLooper)设计)
  • HTTP 2.0 和 3.0 的区别
  • DSN主从同步
  • Linux系统中iptables防火墙
  • 中方警告韩国公司不要向美军工企业出口含中国稀土矿物产品?外交部回应
  • 京东美团商战,能惠及骑手吗?
  • 言短意长|大学校门到底应不应该开放?
  • 习近平同阿塞拜疆总统阿利耶夫会谈
  • 上海银行换帅:顾建忠出任党委书记,金煜辞任董事长
  • 大连万达商业管理集团提前兑付“22大连万达MTN001” ,本息2.64亿元