Spring认证中国教育管理中心-Apache Cassandra 的 Spring 数据教程四

简介: Spring认证中国教育管理中心-Apache Cassandra 的 Spring 数据教程四

9.11.准备好的报表
可以将多次执行的 CQL 语句准备好并存储在一个PreparedStatement对象中,以提高查询性能。驱动程序和 Cassandra 都维护着PreparedStatement查询到其元数据的映射。您可以通过以下抽象使用准备好的语句:

CqlTemplate 通过API的选择
CassandraTemplate 通过启用准备好的语句
Cassandra 存储库,因为它们建立在 CassandraTemplate
9.11.1.使用CqlTemplate
的CqlTemplate类(及其异步和反应性变体)提供的各种方法接受静态CQL,Statement对象和PreparedStatementCreator。接受没有附加参数的静态 CQL 的方法通常按原样运行 CQL 语句,无需进一步处理。接受静态 CQL 与参数数组(例如execute(String cql, Object… args)和queryForRows(String cql, Object…​ args))组合的方法使用准备好的语句。在内部,这些方法创建一个PreparedStatementCreator和PreparedStatementBinder对象来准备语句,然后将值绑定到语句以运行它。Spring Data Cassandra 通常对准备好的语句使用基于索引的参数绑定。

从 Cassandra 驱动程序版本 4 开始,准备好的语句缓存在驱动程序级别,从而无需跟踪应用程序中的准备好的语句。

以下示例显示如何使用参数化的预准备语句发出查询:

String lastName = cqlTemplate.queryForObject(

"SELECT last_name FROM t_actor WHERE id = ?",
String.class, 1212L);

如果您需要对语句准备和参数绑定进行更多控制(例如,使用命名绑定参数),您可以通过使用PreparedStatementCreator和PreparedStatementBinder参数调用查询方法来完全控制准备好的语句创建和参数绑定:

List lastNames = cqlTemplate.query(

session -> session.prepare("SELECT last_name FROM t_actor WHERE id = ?"),
ps -> ps.bind(1212L),
(row, rowNum) -> row.getString(0));

Spring Data Cassandra 在cql包中附带了支持该模式的类:

SimplePreparedStatementCreator - 创建准备好的语句的实用程序类。
ArgumentPreparedStatementBinder - 将参数绑定到准备好的语句的实用程序类。
9.11.2.使用CassandraTemplate
该CassandraTemplate班是建立在顶部CqlTemplate,以提供更高的抽象水平。可以CassandraTemplate通过调用setUsePreparedStatements(false)相应的setUsePreparedStatements(true). 请注意,CassandraTemplate默认情况下启用了预准备语句的使用。

以下示例显示了生成和接受 CQL 的方法的使用:

template.setUsePreparedStatements(true);

Actor actorByQuery = template.selectOne(query(where("id").is(42)), Actor.class);

Actor actorByStatement = template.selectOne(

SimpleStatement.newInstance("SELECT id, name FROM actor WHERE id = ?", 42),
Actor.class);

调用实体绑定方法(例如select(Query, Class)或update(Query, Update, Class)构建 CQL 语句本身)以执行预期操作。某些CassandraTemplate方法(例如select(Statement<?>, Class))还接受 CQLStatement对象作为其 API 的一部分。

在调用接受Statement带有SimpleStatement对象的a 的方法时,可以参与准备好的语句。模板 API 提取查询字符串和参数(位置和命名参数)并使用这些来准备、绑定和运行语句。非SimpleStatement对象不能与准备好的语句一起使用。

9.11.3.缓存准备好的语句
从 Cassandra 驱动程序 4.0 开始,准备好的语句由CqlSession缓存缓存,因此可以准备两次相同的字符串。以前的版本需要在驱动程序之外缓存准备好的语句。另请参阅有关 Prepared Statements的驱动程序文档以获取进一步参考。

  1. 响应式 Cassandra 支持

反应式 Cassandra 支持包含广泛的功能:

Spring 配置支持使用基于 Java 的@Configuration类。
ReactiveCqlTemplate 通过正确处理常见的 Cassandra 数据访问操作来提高生产力的辅助类。
ReactiveCassandraTemplate通过ReactiveCassandraOperations以反应方式使用来提高生产力的助手类。它包括表和 POJO 之间的集成对象映射。
异常转换为 Spring 的可移植数据访问异常层次结构。
与 Spring 的转换服务集成的功能丰富的对象映射。
基于 Java 的查询、标准和更新 DSL。
Repository接口的自动实现,包括对自定义查找器方法的支持。
对于大多数面向数据的任务,您可以使用ReactiveCassandraTemplate或 存储库支持,它使用丰富的对象映射功能。ReactiveCqlTemplate通常用于增加计数器或执行临时 CRUD 操作。ReactiveCqlTemplate还提供了回调方法,可以轻松获取低级 API 对象,例如
com.datastax.oss.driver.api.core.CqlSession,让您可以直接与 Cassandra 通信。Spring Data for Apache Cassandra 对各种 API 中的对象使用与 DataStax Java 驱动程序中的对象一致的命名约定,以便立即熟悉它们,并且您可以将现有知识映射到 Spring API。

10.1.入门
Spring Data for Apache Cassandra 需要 Apache Cassandra 2.1 或更高版本以及 Datastax Java Driver 4.0 或更高版本。快速设置和引导工作环境的一种简单方法是在STS 中创建基于 Spring 的项目或使用Spring Initializer。

首先,您需要设置一个正在运行的 Apache Cassandra 服务器。有关 如何启动 Apache Cassandra 的说明,请参阅 Apache Cassandra 快速入门指南。一旦安装完毕,开始Cassandra是通常运行以下命令即可:
CASSANDRA_HOME/bin/cassandra -f。

要在 STS 中创建 Spring 项目,请转到 File → New → Spring Template Project → Simple Spring Utility Project,然后在出现提示时按 Yes。然后输入项目和包名称,例如
org.spring.data.cassandra.example.

然后,您可以将以下依赖项声明添加到 pom.xml 文件的dependencies部分。

<groupId>org.springframework.data</groupId>
<artifactId>spring-data-cassandra</artifactId>
<version>3.3.0</version>


此外,您应该将 pom.xml 文件中的 Spring 版本更改为如下:

<spring.framework.version>5.3.13</spring.framework.version>
如果使用里程碑版本而不是 GA 版本,您还需要将 Maven 的 Spring Milestone 存储库的位置添加到您的 pom.xml 文件中,使其与您的<dependencies/>元素处于同一级别,如下所示:


<id>spring-milestone</id>
<name>Spring Maven MILESTONE Repository</name>
<url>https://repo.spring.io/libs-milestone</url>



存储库也可在此处浏览。

您还可以在此处浏览所有 Spring 存储库。

现在您可以创建一个简单的 Java 应用程序,该应用程序在 Cassandra 中存储和读取域对象。

为此,首先创建一个简单的域对象类来持久化,如以下示例所示:

package org.springframework.data.cassandra.example;

import org.springframework.data.cassandra.core.mapping.PrimaryKey;
import org.springframework.data.cassandra.core.mapping.Table;

@Table
public class Person {

@PrimaryKey private final String id;

private final String name;
private final int age;

public Person(String id, String name, int age) {

this.id = id;
this.name = name;
this.age = age;

}

public String getId() {

return id;

}

private String getName() {

return name;

}

private int getAge() {

return age;

}

@Override
public String toString() {

return String.format("{ @type = %1$s, id = %2$s, name = %3$s, age = %4$d }", getClass().getName(), getId(),
    getName(), getAge());

}
}
Spring认证中国教育管理中心-Apache Cassandra 的 Spring 数据教程五
接下来,创建要运行的主应用程序,如以下示例所示:

接下来,创建要运行的主应用程序,如以下示例所示:

package org.springframework.data.cassandra.example;

import reactor.core.publisher.Mono;

import java.util.UUID;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.data.cassandra.core.ReactiveCassandraOperations;
import org.springframework.data.cassandra.core.ReactiveCassandraTemplate;
import org.springframework.data.cassandra.core.cql.session.DefaultBridgedReactiveSession;
import org.springframework.data.cassandra.core.query.Criteria;
import org.springframework.data.cassandra.core.query.Query;

import com.datastax.oss.driver.api.core.CqlSession;

public class ReactiveCassandraApplication {

private static final Logger LOGGER = LoggerFactory.getLogger(ReactiveCassandraApplication.class);

private static Person newPerson(String name, int age) {

return new Person(UUID.randomUUID().toString(), name, age);

}

public static void main(String[] args) {

CqlSession cqlSession = CqlSession.builder().withKeyspace("mykeyspace").build();

 ReactiveCassandraOperations template = new ReactiveCassandraTemplate(new DefaultBridgedReactiveSession(cqlSession));

Mono<Person> jonDoe = template.insert(newPerson("Jon Doe", 40));

jonDoe.flatMap(it -> template.selectOne(Query.query(Criteria.where("id").is(it.getId())), Person.class))
    .doOnNext(it -> LOGGER.info(it.toString()))
    .then(template.truncate(Person.class))
    .block();

cqlSession.close();

}

}
Spring认证中国教育管理中心-Apache Cassandra 的 Spring 数据教程五
即使在这个简单的例子中,也有一些值得注意的地方需要指出:

完全同步的流程不会从反应式基础设施中受益,因为反应式编程模型需要同步。
您可以ReactiveCassandraTemplate使用 Cassandra创建一个实例CqlSession。
您必须将 POJO 注释为 Cassandra@Table并注释@PrimaryKey. 或者,您可以覆盖这些映射名称以匹配您的 Cassandra 数据库表和列名称。
您可以使用原始 CQL 或 DataStax QueryBuilderAPI 来构建您的查询。
10.2.示例库
一个Github上库包含了几个例子,您可以下载和玩得到如何图书馆工作的感觉。

10.3.使用 Spring 连接到 Cassandra
在 Spring 中使用 Apache Cassandra 时的首要任务之一是
com.datastax.oss.driver.api.core.CqlSession使用 Spring IoC 容器创建对象。您可以通过使用基于 Java 的 bean 元数据或使用基于 XML 的 bean 元数据来实现。这些将在以下各节中讨论。

对于那些不熟悉如何配置使用基于Java bean的元数据,而不是基于XML的元数据Spring容器,请参阅参考文档的高级介绍 这里 还有详细的文档在这里。

相关文章
|
12月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1929 5
|
11月前
|
人工智能 数据处理 API
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
Apache Flink Agents 是由阿里云、Ververica、Confluent 与 LinkedIn 联合推出的开源子项目,旨在基于 Flink 构建可扩展、事件驱动的生产级 AI 智能体框架,实现数据与智能的实时融合。
1606 6
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
|
存储 Cloud Native 数据处理
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
本文整理自阿里云资深技术专家、Apache Flink PMC 成员梅源在 Flink Forward Asia 新加坡 2025上的分享,深入解析 Flink 状态管理系统的发展历程,从核心设计到 Flink 2.0 存算分离架构,并展望未来基于流批一体的通用增量计算方向。
774 0
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
|
SQL 人工智能 数据挖掘
Apache Flink:从实时数据分析到实时AI
Apache Flink 是实时数据处理领域的核心技术,历经十年发展,已从学术项目成长为实时计算的事实标准。它在现代数据架构中发挥着关键作用,支持实时数据分析、湖仓集成及实时 AI 应用。随着 Flink 2.0 的发布,其在流式湖仓、AI 驱动决策等方面展现出强大潜力,正推动企业迈向智能化、实时化的新阶段。
1346 9
Apache Flink:从实时数据分析到实时AI
|
SQL 人工智能 API
Apache Flink 2.1.0: 面向实时 Data + AI 全面升级,开启智能流处理新纪元
Apache Flink 2.1.0 正式发布,标志着实时数据处理引擎向统一 Data + AI 平台迈进。新版本强化了实时 AI 能力,支持通过 Flink SQL 和 Table API 创建及调用 AI 模型,新增 Model DDL、ML_PREDICT 表值函数等功能,实现端到端的实时 AI 工作流。同时增强了 Flink SQL 的流处理能力,引入 Process Table Functions(PTFs)、Variant 数据类型,优化流式 Join 及状态管理,显著提升作业稳定性与资源利用率。
1031 0
|
存储 人工智能 大数据
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
1386 33
The Past, Present and Future of Apache Flink
|
人工智能 运维 Java
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
本文基于Apache Flink PMC成员宋辛童在Community Over Code Asia 2025的演讲,深入解析Flink Agents项目的技术背景、架构设计与应用场景。该项目聚焦事件驱动型AI智能体,结合Flink的实时处理能力,推动AI在工业场景中的工程化落地,涵盖智能运维、直播分析等典型应用,展现其在AI发展第四层次——智能体AI中的重要意义。
3654 27
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
|
SQL Java API
Apache Flink 2.0-preview released
Apache Flink 社区正积极筹备 Flink 2.0 的发布,这是自 Flink 1.0 发布以来的首个重大更新。Flink 2.0 将引入多项激动人心的功能和改进,包括存算分离状态管理、物化表、批作业自适应执行等,同时也包含了一些不兼容的变更。目前提供的预览版旨在让用户提前尝试新功能并收集反馈,但不建议在生产环境中使用。
1966 13
Apache Flink 2.0-preview released
|
存储 人工智能 数据处理
对话王峰:Apache Flink 在 AI 时代的“剑锋”所向
Flink 2.0 架构升级实现存算分离,迈向彻底云原生化,支持更大规模状态管理、提升资源效率、增强容灾能力。通过流批一体与 AI 场景融合,推动实时计算向智能化演进。生态项目如 Paimon、Fluss 和 Flink CDC 构建湖流一体架构,实现分钟级时效性与低成本平衡。未来,Flink 将深化 AI Agents 框架,引领事件驱动的智能数据处理新方向。
1181 6

热门文章

最新文章