用 MongoTemplate 操作 documentDB 与 用 Spring Data MongoDB 操作 documentDB 有什么不同,write concern,transaction

使用 MongoTemplate 和使用 Spring Data MongoDB 的仓库接口(如 MongoRepository)都是操作 MongoDB 数据库的常见方法,它们在功能上有些重叠,但也有不同的用例和优点。以下是它们的不同之处以及对 Write Concern 支持的情况。

MongoTemplate 和 MongoRepository 的对比

MongoTemplate

  1. 更细粒度的控制MongoTemplate 提供了对 MongoDB 操作的细粒度控制,允许你执行自定义的查询、更新、删除和聚合操作。
  2. 灵活性高:适用于复杂的查询和自定义的数据库操作。
  3. 直接操作 MongoDB APIMongoTemplate 直接使用 MongoDB Java Driver 提供的方法,可以更直接地使用 MongoDB 的底层功能。
  4. 写操作和查询的灵活配置:可以灵活地配置 Write Concern 和 Read Preference,以确保数据一致性和性能。

Spring Data MongoDB Repository (MongoRepository)

  1. 简洁易用MongoRepository 提供了一套简洁的 CRUD 操作接口,极大地简化了常见数据库操作。
  2. 自动化功能:支持分页、排序、查询方法名解析等自动化功能,减少了样板代码。
  3. 抽象级别高:更适合标准的 CRUD 操作,开发效率更高。
  4. 容易扩展:可以很容易地扩展自定义查询。

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 时,可以使用 MongoTemplateMongoRepository 进行事务操作。不过需要注意的是,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);
    }
}

事务支持的注意事项

  1. 单文档事务:在 MongoDB 和 AWS DocumentDB 中,单文档操作(如插入、更新和删除)本质上是原子的。
  2. 多文档事务:MongoDB 4.0 及以上版本支持多文档事务,而 AWS DocumentDB 目前支持多文档事务,但不完全兼容 MongoDB 的事务模型。

总结

  • MongoTemplateMongoRepository 都支持事务操作,均通过 Spring 的 @Transactional 注解实现。
  • 在进行事务操作时,确保使用的 MongoDB 版本或 AWS DocumentDB 实例支持事务特性。
  • 对于复杂的多文档事务操作,建议详细了解 AWS DocumentDB 的事务支持情况,以确保符合业务需求。
posted @ 2024-07-09 01:28  gongchengship  阅读(32)  评论(0编辑  收藏  举报