Cassandra 支持
本部分参考文档介绍 Spring Data for Apache Cassandra 提供的核心功能。Spring Data 对 Apache Cassandra 的支持涵盖广泛的特性:
-
通过基于 Java 的 @Configuration 类或 XML 命名空间提供 Spring 配置支持。
-
CqlTemplate、AsyncCqlTemplate 和 ReactiveCqlTemplate 辅助类,通过妥善处理常见的 Cassandra 数据访问操作来提高开发效率。
-
CassandraTemplate、AsyncCassandraTemplate 和 ReactiveCassandraTemplate 辅助类,在 CQL 表与 POJO 之间提供对象映射。
-
将异常转换为 Spring 可移植的数据访问异常层次结构。
-
基于注解的映射元数据,可扩展以支持其他元数据格式。
-
基于 Java 的查询、条件和更新 DSL。
-
自动实现命令式和响应式 Repository 接口,包括对自定义查询方法的支持。
抽象
Spring Data for Apache Cassandra 允许在 CQL 层面和实体层面进行交互。
Spring Data for Apache Cassandra 抽象所带来的价值,或许最能通过下表所列的一系列操作来说明。该表展示了哪些操作由 Spring 负责,哪些操作由您(应用开发者)负责。
表 1. Spring Data for Apache Cassandra——谁做什么?
| 操作 | Spring | 您 |
|---|---|---|
| 定义连接参数。 | X | |
| 打开连接。 | X | |
| 指定 CQL 语句。 | X | |
| 声明参数并提供参数值 | X | |
| 准备并运行语句。 | X | |
| 设置循环以遍历结果(如果有)。 | X | |
| 对每次迭代执行操作。 | X | |
| 处理任何异常。 | X | |
| 关闭会话。 | X |
核心 CQL 支持处理了所有底层细节,正是这些细节让 Cassandra 和 CQL 成为一个开发起来颇为繁琐的 API。使用已映射的实体对象可以实现模式生成、对象映射和仓库支持。
选择 Cassandra 数据库访问方式
您可以在多种方式中选择一种作为 Cassandra 数据库访问的基础。Spring 对 Apache Cassandra 的支持有不同的风格。一旦开始使用其中一种方式,您仍然可以混合搭配,引入另一种方式的特性。以下几种方式都能很好地工作:
-
CqlTemplate 和 ReactiveCqlTemplate 是经典的 Spring CQL 方式,也是最流行的。这是“最低层”的方式。请注意,像
CassandraTemplate这样的组件在底层使用的就是CqlTemplate。 -
CassandraTemplate 封装了
CqlTemplate,提供查询结果到对象的映射,并使用SELECT、INSERT、UPDATE和DELETE方法,而不必编写 CQL 语句。这种方式文档更完善、更易用。 -
ReactiveCassandraTemplate 封装了
ReactiveCqlTemplate,提供查询结果到对象的映射,并使用SELECT、INSERT、UPDATE和DELETE方法,而不必编写 CQL 语句。这种方式文档更完善、更易用。 -
仓库抽象让您可以在数据访问层中创建仓库声明。Spring Data 仓库抽象的目标是显著减少为各种持久化存储实现数据访问层所需的样板代码量。
对于大多数面向数据的任务,您可以使用 [Reactive|Async]CassandraTemplate 或 Repository 支持,二者都使用丰富的对象映射功能。[Reactive|Async]CqlTemplate 通常用于递增计数器或执行临时的 CRUD 操作。[Reactive|Async]CqlTemplate 还提供回调方法,方便您获取底层 API 对象,例如 com.datastax.oss.driver.api.core.CqlSession,从而直接与 Cassandra 通信。Spring Data for Apache Cassandra 在各种 API 上对对象采用与 DataStax Java Driver 一致的命名约定,使它们彼此熟悉,便于您将已有知识迁移到 Spring API 上。
本节小结
快速上手
Spring Data for Apache Cassandra 需要 Apache Cassandra 2.1 或更高版本以及 Datastax Java Driver 4.0 或更高版本。快速搭建并初始化一个可用环境的简便方式是在 Spring Tools 中创建一个基于 Spring 的项目,或使用 start.spring.io 。
使用 Spring 连接 Cassandra
在 Spring 中使用 Apache Cassandra 的首要任务之一,是通过 Spring IoC 容器创建一个 com.datastax.oss.driver.api.core.CqlSession 对象。您可以使用基于 Java 的 bean 元数据,也可以使用基于 XML 的 bean 元数据来完成。以下各节将对此进行讨论。
模式管理
Apache Cassandra 是一种数据存储,在进行任何数据交互之前需要先定义模式。 Spring Data for Apache Cassandra 可以在模式创建方面为您提供支持。
CQL Template API
CqlTemplate 类(及其响应式变体 ReactiveCqlTemplate )是核心 CQL 包中的核心类。它负责资源的创建与释放。它执行核心 CQL 工作流的基本任务,例如语句的创建和执行,而把提供 CQL 和提取结果的工作留给应用代码。 CqlTemplate 类执行 CQL 查询和更新语句,遍历 ResultSet 实例并提取返回的参数值。它还捕获 CQL 异常,并将其转换为 org.springframework.dao 包中定义的通用、信息更丰富的异常层次结构。
响应式基础设施
响应式 Cassandra 支持涵盖广泛的特性:
持久化实体
`CassandraTemplate` 类(及其响应式变体 `ReactiveCassandraTemplate` )位于 `org.springframework.data.cassandra` 包中,是 Spring 的 Cassandra 支持中的核心类,并提供丰富的功能集来与数据库交互。该模板提供便捷操作,以创建、更新、删除和查询 Cassandra ,并在您的领域对象与 Cassandra 表中的行之间提供映射。
预编译语句
多次执行的 CQL 语句可以预编译并存储在 PreparedStatement 对象中,以提升查询性能。驱动和 Cassandra 都会维护 PreparedStatement 查询与其元数据的映射。您可以通过以下抽象使用预编译语句:
对象映射
`MappingCassandraConverter` 提供了丰富的对象映射支持。 `MappingCassandraConverter` 拥有一个丰富的元数据模型,提供一套完整的功能集,用于将领域对象映射到 CQL 表。
属性路径
本章介绍属性路径的概念。属性路径是一种遍历领域类的导航形式,用于在与模型交互的上下文中应用某些方面。应用代码向数据访问组件提供属性路径,以表达诸如在查询中选择属性、构成谓词或应用排序等意图。属性路径源自其所属类型,可由一个或多个段组成。
基于类型的转换器
以下 Spring Converter 实现的示例展示了如何从 String 转换为自定义的 Email 值对象:
基于属性的转换器
虽然基于类型的转换已经提供了影响目标存储中特定类型的转换和表示方式,但当只应对特定类型的某些值或属性进行转换时,它存在局限。基于属性的转换器允许按属性配置转换规则,既可以声明式地(通过 @ValueConverter ),也可以编程式地(为特定属性注册 PropertyValueConverter )。
生命周期事件
Cassandra 映射框架内置了若干 org.springframework.context.ApplicationEvent 事件,您的应用可以通过在 ApplicationContext 中注册特殊 bean 来响应这些事件。由于基于 Spring 的应用上下文事件基础设施构建,其他产品(如 Spring Integration )可以轻松接收这些事件,因为它们是基于 Spring 的应用中广为人知的事件机制。
Cassandra 审计配置
要启用审计功能,请按以下示例创建配置:
值表达式基础
值表达式是 Spring 表达式语言( SpEL )与属性占位符解析的结合。它将程序化表达式的强大求值能力与借助属性占位符解析从 Environment 获取值(如配置属性)的简洁性结合在一起。