Spring Boot集成MongoDB实战技巧与性能调优
一、集成步骤
-
添加依赖
在
pom.xml
中引入Spring Data MongoDB起步依赖:xml<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
-
配置连接信息
在
application.properties
或application.yml
中配置MongoDB连接:propertiesspring.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
-
实体类映射
使用注解定义文档和字段映射:
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; }
-
Repository接口
继承
MongoRepository
实现基础CRUD:javapublic interface UserRepository extends MongoRepository<User, String> { // 自动生成查询方法 List<User> findByUsername(String username); @Query("{ 'age' : { $gt: ?0 } }") // 自定义查询 List<User> findUsersOlderThan(int age); }
二、实战技巧
-
索引优化
-
单字段索引 :使用
@Indexed
注解。 -
复合索引 :通过
@CompoundIndex
或在代码中创建:javamongoTemplate.indexOps(User.class).ensureIndex( new Index().on("username", Sort.Direction.ASC) .on("email", Sort.Direction.DESC) );
-
-
分页与排序
使用
Pageable
实现分页查询:javaPage<User> users = userRepository.findAll(PageRequest.of(0, 10, Sort.by("createTime")));
-
事务支持(MongoDB 4.0+)
-
确保MongoDB为副本集模式。
-
在Spring Boot中启用事务:
java@Transactional public void updateUser(User user) { // 事务操作 }
-
-
批量操作
使用
BulkOperations
提升写入性能:javaBulkOperations bulkOps = mongoTemplate.bulkOps(BulkMode.ORDERED, User.class); bulkOps.insert(userList); bulkOps.execute();
-
读写分离
配置
ReadPreference
将读请求路由到Secondary节点:java@Bean public MongoTemplate mongoTemplate(MongoDatabaseFactory factory) { MongoTemplate template = new MongoTemplate(factory); template.setReadPreference(ReadPreference.secondaryPreferred()); return template; }
-
投影优化
减少返回字段,提升查询效率:
javaQuery query = new Query().addCriteria(Criteria.where("username").is("Alice")) .fields().include("username").exclude("id"); List<User> users = mongoTemplate.find(query, User.class);
三、性能调优
-
连接池配置
调整连接池参数避免资源耗尽:
propertiesspring.data.mongodb.uri=mongodb://host:port/database?minPoolSize=10&maxPoolSize=100&maxIdleTimeMS=30000
-
监控慢查询
-
启用MongoDB Profiling:
javascriptdb.setProfilingLevel(1, { slowms: 50 }) // 记录超过50ms的查询
-
分析日志并优化索引或查询逻辑。
-
-
避免全集合扫描
- 使用
explain()
分析查询计划,确保命中索引。 - 避免在未索引字段上使用
$regex
或$where
。
- 使用
-
合理分片
大数据量场景下,通过分片分散负载:
javascriptsh.enableSharding("database") sh.shardCollection("database.users", { "userId": "hashed" })
-
文档结构设计
- 内嵌文档:适合频繁访问的子数据(如用户地址)。
- 引用关联:适合大型或频繁更新的子数据(如评论)。
-
缓存热点数据
使用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)持续分析调整。