用 MongoTemplate 操作 documentDB 与 用 Spring Data MongoDB 操作 documentDB 有什么不同,write concern,transaction
使用 MongoTemplate
和使用 Spring Data MongoDB 的仓库接口(如 MongoRepository
)都是操作 MongoDB 数据库的常见方法,它们在功能上有些重叠,但也有不同的用例和优点。以下是它们的不同之处以及对 Write Concern 支持的情况。
MongoTemplate 和 MongoRepository 的对比
MongoTemplate
- 更细粒度的控制:
MongoTemplate
提供了对 MongoDB 操作的细粒度控制,允许你执行自定义的查询、更新、删除和聚合操作。 - 灵活性高:适用于复杂的查询和自定义的数据库操作。
- 直接操作 MongoDB API:
MongoTemplate
直接使用 MongoDB Java Driver 提供的方法,可以更直接地使用 MongoDB 的底层功能。 - 写操作和查询的灵活配置:可以灵活地配置 Write Concern 和 Read Preference,以确保数据一致性和性能。
Spring Data MongoDB Repository (MongoRepository)
- 简洁易用:
MongoRepository
提供了一套简洁的 CRUD 操作接口,极大地简化了常见数据库操作。 - 自动化功能:支持分页、排序、查询方法名解析等自动化功能,减少了样板代码。
- 抽象级别高:更适合标准的 CRUD 操作,开发效率更高。
- 容易扩展:可以很容易地扩展自定义查询。
Write Concern 支持情况
MongoTemplate
MongoTemplate
支持通过 WriteConcern
对象配置写操作的 Write Concern,从而控制写操作的确认级别。
示例代码:
import com.mongodb.client.MongoClients;
import com.mongodb.WriteConcern;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.WriteConcernResolver;
import org.springframework.data.mongodb.core.SimpleMongoClientDbFactory;
@Configuration
public class MongoConfig {
@Bean
public MongoTemplate mongoTemplate() {
MongoTemplate mongoTemplate = new MongoTemplate(
new SimpleMongoClientDbFactory(MongoClients.create("mongodb://<username>:<password>@<documentdb-endpoint>:<port>/<database>?ssl=true&retryWrites=false"),
"<database>"));
mongoTemplate.setWriteConcern(WriteConcern.MAJORITY);
return mongoTemplate;
}
}
MongoRepository
在 Spring Data MongoDB 中,可以通过自定义 MongoTemplate
并将其注入到仓库中,从而实现对 Write Concern 的配置。
示例代码:
import com.mongodb.client.MongoClients;
import com.mongodb.WriteConcern;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDbFactory;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
@Configuration
@EnableMongoRepositories(basePackages = "com.example.repository")
public class MongoConfig {
@Bean
public MongoTemplate mongoTemplate() {
MongoTemplate mongoTemplate = new MongoTemplate(
new SimpleMongoClientDbFactory(MongoClients.create("mongodb://<username>:<password>@<documentdb-endpoint>:<port>/<database>?ssl=true&retryWrites=false"),
"<database>"));
mongoTemplate.setWriteConcern(WriteConcern.MAJORITY);
return mongoTemplate;
}
}
总结
- MongoTemplate 提供了对 MongoDB 操作的更细粒度控制,适合复杂查询和自定义操作,支持灵活配置 Write Concern。
- MongoRepository 提供了一套简洁的 CRUD 操作接口,适合标准的 CRUD 操作和自动化功能,可以通过注入自定义
MongoTemplate
来配置 Write Concern。
这两种方法各有优劣,可以根据具体的需求选择合适的方式。如果需要更复杂的数据库操作和更高的灵活性,建议使用 MongoTemplate
;如果主要是进行标准的 CRUD 操作,并且希望简化开发流程,建议使用 MongoRepository
。
对事务 Translate 操作的支持
在使用 Spring Data MongoDB 操作 AWS DocumentDB 时,可以使用 MongoTemplate
和 MongoRepository
进行事务操作。不过需要注意的是,AWS DocumentDB 在事务支持上与 MongoDB 4.0 有所不同,它并不完全支持分布式事务。
MongoTemplate 和事务操作
使用 MongoTemplate
进行事务操作是通过 Spring 的 @Transactional
注解实现的。示例如下:
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.Transactional;
@Configuration
@EnableTransactionManagement
public class MongoConfig {
@Bean
public MongoDatabaseFactory mongoDbFactory() {
return new SimpleMongoClientDatabaseFactory(MongoClients.create("mongodb://<username>:<password>@<documentdb-endpoint>:<port>/<database>?ssl=true&retryWrites=false"),
"<database>");
}
@Bean
public MongoTemplate mongoTemplate() {
return new MongoTemplate(mongoDbFactory());
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
@Autowired
private MongoTemplate mongoTemplate;
@Transactional
public void performTransactionalOperation(User user1, User user2) {
mongoTemplate.save(user1);
mongoTemplate.save(user2);
}
}
MongoRepository 和事务操作
同样地,使用 MongoRepository
进行事务操作也是通过 Spring 的 @Transactional
注解实现的。示例如下:
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
@EnableMongoRepositories(basePackages = "com.example.repository")
public class MongoConfig {
@Bean
public MongoDatabaseFactory mongoDbFactory() {
return new SimpleMongoClientDatabaseFactory(MongoClients.create("mongodb://<username>:<password>@<documentdb-endpoint>:<port>/<database>?ssl=true&retryWrites=false"),
"<database>");
}
@Bean
public MongoTemplate mongoTemplate() {
return new MongoTemplate(mongoDbFactory());
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public void performTransactionalOperation(User user1, User user2) {
userRepository.save(user1);
userRepository.save(user2);
}
}
事务支持的注意事项
- 单文档事务:在 MongoDB 和 AWS DocumentDB 中,单文档操作(如插入、更新和删除)本质上是原子的。
- 多文档事务:MongoDB 4.0 及以上版本支持多文档事务,而 AWS DocumentDB 目前支持多文档事务,但不完全兼容 MongoDB 的事务模型。
总结
- MongoTemplate 和 MongoRepository 都支持事务操作,均通过 Spring 的
@Transactional
注解实现。 - 在进行事务操作时,确保使用的 MongoDB 版本或 AWS DocumentDB 实例支持事务特性。
- 对于复杂的多文档事务操作,建议详细了解 AWS DocumentDB 的事务支持情况,以确保符合业务需求。