从 2.x 迁移到 3.x 的指南

Spring Data for Apache Cassandra 3.0 在从早期版本升级时引入了一系列重大更改。

审查依赖项

升级到 Spring Data Cassandra 需要升级到 DataStax Driver 版本 4。升级到新驱动程序会带来传递依赖项更改,最值得注意的是,Google Guava 由驱动程序捆绑和遮蔽。请查看 DataStax Java Driver for Apache Cassandra 4 升级指南 以获取有关驱动程序相关更改的详细信息。

调整配置

DataStax Java Driver 4 将 ClusterSession 对象合并到一个 CqlSession 对象中,因此,所有 Cluster 相关 API 都已删除。配置在很大程度上进行了修订,删除了大部分已移入 DriverConfigLoader 的配置项,而 DriverConfigLoader 大部分是基于文件的。这意味着 SocketOptionsAddressTranslator 和更多选项现在通过其他方式进行配置。

如果您正在使用基于 XML 的配置,请确保将所有配置文件从 cql 命名空间 (www.springframework.org/schema/cql www.springframework.org/schema/cql/spring-cql.xsd) 迁移到 cassandra 命名空间 (www.springframework.org/schema/data/cassandra www.springframework.org/schema/data/cassandra/spring-cassandra.xsd)。

为了反映配置构建器的变化,ClusterBuilderConfigurer 被重命名为 SessionBuilderConfigurer,现在接受 CqlSessionBuilder 而不是 Cluster.Builder。请确保在配置中提供本地数据中心,因为它是在正确配置负载均衡时所必需的。

连接性

Cluster (cassandra:cluster) 和 Session (cassandra:session) 的配置元素合并到一个 CqlSession (cassandra:session) 元素中,该元素同时配置键空间和端点。

随着升级,模式支持已移至新的命名空间元素:cassandra:session-factory,它提供了一个 SessionFactory bean。

示例 1. 版本 2 中的集群、会话和模式配置
<cassandra:cluster contact-points="localhost" port="9042">
  <cassandra:keyspace action="CREATE_DROP" name="mykeyspace" />
</cassandra:cluster>

<cassandra:session keyspace-name="mykeyspace" schema-action="CREATE">
  <cassandra:startup-cql>CREATE TABLE …</cassandra:startup-cql>
</cassandra:session>
示例 2. 版本 3 中的会话和模式配置
<cassandra:session contact-points="localhost" port="9042" keyspace="mykeyspace" local-datacenter="datacenter1">
  <cassandra:keyspace action="CREATE_DROP" name="mykeyspace" />
</cassandra:session>

<cassandra:session-factory schema-action="CREATE">
  <cassandra:script location="classpath:/schema.cql"/>
</cassandra:session-factory>
Spring Data Cassandra 3.0 在使用 XML 命名空间配置时不再注册默认的映射上下文、上下文和模板 API bean。默认值应在应用程序或 Spring Boot 级别应用。

模板 API

如果您的应用程序主要与映射实体或基本 Java 类型交互,Spring Data for Apache Cassandra 封装了大部分随驱动程序升级而来的更改,包括模板 API 和存储库支持。

我们通常建议使用 SessionFactory 创建 CqlTemplateCassandraTemplate 对象,因为工厂使用允许模式创建同步,并在使用多个数据库时引入了一定程度的灵活性。

示例 3. 版本 2 中的模板 API 配置
<cql:template session-ref="…" />

<cassandra:template session-ref="…" cassandra-converter-ref="…"/>
示例 4. 版本 3 中的模板 API 配置
<cassandra:session-factory />

<cassandra:cql-template session-factory-ref="…" />

<cassandra:template session-factory-ref="…" cassandra-converter-ref="…"/>

您将不得不修改所有直接使用 DataStax 驱动程序 API 的代码。典型情况包括

  • ResultSetExtractor 的实现

  • RowCallbackHandler 的实现

  • RowMapper 的实现

  • PreparedStatementCreator 的实现,包括异步和反应式变体

  • 调用 CqlTemplate.queryForResultSet(…)

  • 调用接受 Statement 的方法

AsyncCqlTemplate 中的更改

DataStax 驱动程序 4 更改了异步运行查询的结果类型。为了反映这些更改,您需要调整提供以下内容的代码

  • AsyncSessionCallback 的实现

  • AsyncPreparedStatementCreator 的实现

结果集提取需要 DataStax 的 AsyncResultSet 的新接口。AsyncCqlTemplate 现在在以前使用 ResultSetExtractor 的地方使用 AsyncResultSetExtractor。请注意,AsyncResultSetExtractor.extractData(…) 返回一个 Future 而不是标量对象,因此代码迁移带来了在提取器中使用完全非阻塞代码的可能性。

数据模型迁移

如果您使用以下功能,您的数据模型可能需要更新

  • @CassandraType

  • @Table@Column@PrimaryKeyColumn@PrimaryKey@UserDefinedType 中的 forceQuote

  • 使用 java.lang.Date 的属性

  • 使用 UDTValueTupleValue 的属性

@CassandraType

DataStax 驱动程序 4 不再附带用于描述 Cassandra 类型的 Name 枚举。我们决定重新引入带有 CassandraType.Name 的枚举。请务必更新您的导入以使用新引入的替换类型。

强制引用

此标志现已弃用,我们建议不再使用它。Spring Data for Apache Cassandra 内部使用驱动程序的 CqlIdentifier,它确保在需要时进行引用。

属性类型

DataStax 驱动程序 4 不再使用 java.lang.Date。请将您的数据模型升级为使用 java.time.LocalDateTime。还请将原始 UDT 和元组类型迁移到新的驱动程序类型 UdtValueTupleValue

其他更改

  • 驱动程序的 ConsistencyLevel 常量类已删除,并重新引入为 DefaultConsistencyLevel@Consistency 已适配为 DefaultConsistencyLevel

  • QueryOptions…CqlTemplate 类型上的 RetryPolicy 已删除,没有替代品。

  • 驱动程序的 PagingState 类型已删除。分页状态现在使用 ByteBuffer

  • SimpleUserTypeResolver 接受 CqlSession 而不是 Cluster

  • SimpleTupleTypeFactory 已迁移到 enumSimpleTupleTypeFactory.INSTANCE 不再需要 Cluster/CqlSession 上下文。

  • 引入 StatementBuilder 以函数式构建语句,因为 QueryBuilder API 使用不可变语句类型。

  • Session bean 从 session 重命名为 cassandraSessionSessionFactory bean 从 sessionFactory 重命名为 cassandraSessionFactory

  • ReactiveSession bean 从 reactiveSession 重命名为 reactiveCassandraSessionReactiveSessionFactory bean 从 reactiveSessionFactory 重命名为 reactiveCassandraSessionFactory

  • ReactiveSessionFactory.getSession() 现在返回 Mono<ReactiveSession>。之前它只返回 ReactiveSession

  • 数据类型解析已移至 ColumnTypeResolver,因此所有 DataType 相关方法已从 CassandraPersistentEntity/CassandraPersistentProperty 移至 ColumnTypeResolver(受影响的方法是 MappingContext.getDataType(…)CassandraPersistentProperty.getDataType()CassandraPersistentEntity.getUserType()CassandraPersistentEntity.getTupleType())。

  • 模式创建已从 MappingContext 移至 SchemaFactory(受影响的方法是 CassandraMappingContext.getCreateTableSpecificationFor(…)CassandraMappingContext.getCreateIndexSpecificationsFor(…)CassandraMappingContext.getCreateUserTypeSpecificationFor(…))。

弃用

  • CassandraCqlSessionFactoryBean,请改用 CqlSessionFactoryBean

  • KeyspaceIdentifierCqlIdentifier,请改用 com.datastax.oss.driver.api.core.CqlIdentifier

  • CassandraSessionFactoryBean,请改用 CqlSessionFactoryBean

  • AbstractCqlTemplateConfiguration,请改用 AbstractSessionConfiguration

  • AbstractSessionConfiguration.getClusterName(),请改用 AbstractSessionConfiguration.getSessionName()

  • CodecRegistryTupleTypeFactory,请改用 SimpleTupleTypeFactory

  • Spring Data 的 CqlIdentifier,请改用驱动程序的 CqlIdentifier

  • forceQuote 属性,因为不再需要引用。CqlIdentifier 正确转义保留关键字并处理大小写敏感性。

  • QueryOptions…CqlTemplate 类型上的 fetchSize 已弃用,请改用 pageSize

  • CassandraMappingContext.setUserTypeResolver(…)CassandraMappingContext.setCodecRegistry(…)CassandraMappingContext.setCustomConversions(…):在 CassandraConverter 上配置这些属性。

  • TupleTypeFactoryCassandraMappingContext.setTupleTypeFactory(…)TupleTypeFactory 不再使用,因为 Cassandra 驱动程序附带了一个 DataTypes.tupleOf(…) 工厂方法。

  • 通过 CqlSessionFactoryBean (cassandra:session) 创建模式已弃用。通过 CqlSessionFactoryBean (cassandra:session) 创建键空间不受影响。

移除

配置 API

  • PoolingOptionsFactoryBean

  • SocketOptionsFactoryBean

  • CassandraClusterFactoryBean

  • CassandraClusterParser

  • CassandraCqlClusterFactoryBean

  • CassandraCqlClusterParser

  • CassandraCqlSessionParser

  • AbstractClusterConfiguration

  • ClusterBuilderConfigurer(请改用 SessionBuilderConfigurer

实用程序

  • GuavaListenableFutureAdapter

  • QueryOptionsWriteOptions 构造函数接受 ConsistencyLevelRetryPolicy 参数。请改用构建器结合执行配置文件。

  • CassandraAccessor.setRetryPolicy(…)ReactiveCqlTemplate.setRetryPolicy(…) 方法。请改用执行配置文件。

命名空间支持

新增

配置 API

  • CqlSessionFactoryBean

  • InitializeKeyspaceBeanDefinitionParser

  • SessionFactoryFactoryBean,包括通过 KeyspacePopulator 创建模式

  • KeyspacePopulatorSessionFactoryInitializer 用于初始化键空间

命名空间支持

  • cassandra:cluster(端点属性合并到 cassandra:session

  • cassandra:initialize-keyspace 命名空间支持

  • cassandra:session-factorycassandra:script 支持

© . This site is unofficial and not affiliated with VMware.