Spring Data Lovelace M2 新特性 - 为 MongoDB 3.6 和 4.0 做好准备。

工程 | Christoph Strobl | 2018年4月18日 | ...

随着最新的 Spring Data Lovelace 里程碑版本 2 的发布,MongoDB 模块正在积累新的特性,这些特性将在不久的将来提供给您。您可能已经在新闻中了解到,MongoDB 4 将为文档存储带来 ACID 事务。最新的 MongoDB 3.6 服务器版本已经附带了这些事务的主要构建块,客户端会话

您可以在 MongoDB 参考中阅读有关隔离级别和因果一致性的所有内容。简而言之,会话允许您按顺序执行操作,这些操作尊重它们之间的因果关系。

使用 Spring Data MongoDB,ClientSession 对于命令式和响应式世界来说触手可及,因为我们已将它们整合到现有的 MongoOperationsReactiveMongoOperations 中。为了提供最大的控制权并保持足够的便利性,ClientSession 生命周期由您管理,而模板负责将会话正确地传递给驱动程序。以下示例演示了如何创建 ClientSession

ClientSessionOptions sessionOptions = ClientSessionOptions.builder()
    .causallyConsistent(true)
    .build();

ClientSession session = client.startSession(sessionOptions);

一旦从 MongoDB Java 驱动程序中获取了会话,您只需将其添加到模板中以检索与会话绑定的操作,并在完成后 close() 会话,如下例所示

MongoOperations sessionBound = template.withSession(session);

Query query = query(where("name").is("Durzo Blint")
Person durzo = sessionBound.findOne(query), Person.class);

Person kylar = new Person("Kylar Stern");
kylar.setMaster(durzo);

sessionBound.insert(kylar);

session.close();

使用响应式编程模型,上述示例看起来略有不同,因为我们即将获得一个会话 Publisher,并且希望确保在实际订阅之前不解析它。因此,我们不是获取一个会话范围的 ReactiveMongoTemplate,而是获取一个 ReactiveSessionScoped 的实例,它保存对会话 Publisher 的引用,并提供执行和关闭句柄,以便我们可以确保在返回的 Fluxfinally 块中关闭 ClientSession,如下例所示

ClientSessionOptions sessionOptions = ClientSessionOptions.builder()
    .causallyConsistent(true)
    .build();

// obtain a session, but do not subscribe to it
Publisher<ClientSession> session = client.startSession(sessionOptions);

template.withSession(session)
    .execute(action -> {

        Query query = query(where("name").is("Durzo Blint"));
        return action.findOne(query, Person.class)
            .flatMap(durzo -> {

                Person kylar = new Person("Kylar Stern");
                kylar.setMaster(durzo);

                return action.insert(kylar);
            });
    }, ClientSession::close) // make sure we close the session when finished
    .subscribe();

到目前为止,一切顺利,但我们不是在本文开头提到了事务吗?

没错,事务将是 MongoDB 4.0 的一部分,而且,我们将为此做好准备。如果您想关注我们对事务支持的努力,请确保关注开发进度。以下是您可能期望的内容的快速概述。

MongoTransactionManager 将成为众所周知的事务支持的网关,允许应用程序使用 Spring 的托管事务功能。MongoTransactionManager 将创建并绑定一个 ClientSession 到线程。事务启动、提交或中止,而 MongoTemplate 自动检测现有的 ClientSession 并相应地对其进行操作,如下例所示

@Configuration
public class Config extends AbstractMongoConfiguration {

  @Bean
  MongoTransactionManager transactionManager(MongoDbFactory dbFactory) {
    return new MongoTransactionManager(dbFactory);
  }

  // ...
}

@Service
public class NightAngel {

  @Autowired PersonRepository repository;

  @Transactional
  public void trainAzoth() {

    Person durzo = repository.findByName("Durzo Blint");

    Person kylar = new Person("Kylar Stern");
    kylar.setMaster(durzo);

    repository.save(kylar);    
  }
}

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部