Prepared Statements

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

Using CqlTemplate

CqlTemplate 类(及其异步和反应式变体)提供各种接受静态 CQL、Statement 对象和 PreparedStatementCreator 的方法。通常,接受静态 CQL 而没有附加参数的方法会按原样运行 CQL 语句,而不会进行进一步处理。接受静态 CQL 和参数数组相结合的方法(例如 execute(String cql, Object…​ args)queryForRows(String cql, Object…​ args)) 会使用已准备好的语句。在内部,这些方法会创建 PreparedStatementCreatorPreparedStatementBinder 对象来准备语句并稍后将值绑定到语句以运行它。Spring Data Cassandra 通常对已准备好的语句使用基于索引的参数绑定。

自 Cassandra 4 版以来,已准备好的语句已在驱动程序级别缓存,这就无需在应用程序中跟踪已准备好的语句。

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

  • Imperative

  • Reactive

link:example$CqlTemplateExamples.java[role=include]
link:example$ReactiveCqlTemplateExamples.java[role=include]

在需要对语句准备和参数绑定有更多控制的情况下(例如使用命名的绑定参数),您可以通过使用带 PreparedStatementCreatorPreparedStatementBinder 参数调用查询方法来完全控制已准备好的语句的创建和参数绑定:

  • Imperative

  • Reactive

link:example$CqlTemplateExamples.java[role=include]
link:example$ReactiveCqlTemplateExamples.java[role=include]

Spring Data Cassandra 随附支持该模式的类,位于 cql 包中:

  • SimplePreparedStatementCreator - 用于创建准备好的语句的实用程序类。

  • ArgumentPreparedStatementBinder - 用于将参数绑定到准备好的语句的实用程序类。

Using CassandraTemplate

CassandraTemplate 类建立在 CqlTemplate 之上,以提供更高级别的抽象。可以通过调用 setUsePreparedStatements(false)setUsePreparedStatements(true) 直接在 CassandraTemplate(及其异步和反应式变体)上控制已准备语句的使用。请注意,CassandraTemplate 默认启用已准备语句的使用。

以下示例演示生成并接受 CQL 的方法的使用情况:

  • Imperative

  • Reactive

link:example$CassandraTemplateExamples.java[role=include]
link:example$ReactiveCassandraTemplateExamples.java[role=include]

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

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

Caching Prepared Statements

自 Cassandra 驱动程序 4.0 以来,准备好的语句由 CqlSession 缓存,因此准备相同的字符串两次是可以的。早期版本要求在驱动程序外部缓存准备好的语句。有关更多参考,请参阅 Driver documentation on Prepared Statements