|
此版本仍在开发中,尚未被视为稳定版本。如需最新稳定版本,请使用 Spring Data Cassandra 5.0.4! |
从 2.x 迁移到 3.x 的迁移指南
Spring Data for Apache Cassandra 3.0 在从早期版本升级时引入了一系列破坏性变更。
审查依赖项
升级到 Spring Data Cassandra 需要同时将 DataStax 驱动程序升级到第 4 版。升级到新驱动程序会带来传递依赖项的变更,其中最值得注意的是,Google Guava 已被该驱动程序打包并进行了重命名(shaded)。 有关驱动程序相关变更的详细信息,请参阅 DataStax Apache Cassandra Java 驱动程序 4 升级指南。
适配配置
DataStax Java Driver 4 将 Cluster 和 Session 对象合并为单一的 CqlSession 对象,因此所有与 Cluster 相关的 API 均已被移除。
配置在很大程度上进行了修订,移除了大多数已迁移到 DriverConfigLoader 的配置项,而 SocketOptions 主要基于文件进行配置。
这意味着 AddressTranslator、7 以及许多其他选项现在需通过其他方式进行配置。
如果您使用的是基于 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)元素,该元素同时配置键空间(keyspace)和端点(endpoints)。
升级后,模式支持被移至一个新的命名空间元素:cassandra:session-factory,该元素提供了一个 SessionFactory bean。
<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>
<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>
| 使用 XML 命名空间配置时,Spring Data Cassandra 3.0 不再注册默认的 Mapping Context、Context 和 Template API Bean。 默认行为应由应用程序或 Spring Boot 层面来应用。 |
模板 API
Spring Data for Apache Cassandra 封装了驱动程序升级所带来的大部分变更,前提是您的应用程序主要通过模板 API 和仓库支持与映射的实体或 Java 基本类型进行交互。
我们通常建议使用 CqlTemplate 和 CassandraTemplate 对象时,通过 SessionFactory 来创建,因为这种工厂用法可以实现模式(schema)创建的同步,并在处理多个数据库时提供一定程度的灵活性。
<cql:template session-ref="…" />
<cassandra:template session-ref="…" cassandra-converter-ref="…"/>
<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 现在在其原先使用 AsyncResultSetExtractor 的地方改用 ResultSetExtractor。
请注意,AsyncResultSetExtractor.extractData(…) 返回的是一个 Future 而非普通对象,因此在迁移代码时,可以在提取器中完全使用非阻塞代码。
数据模型迁移
其他变更
-
驱动程序的
ConsistencyLevel常量类已被移除,并重新引入为DefaultConsistencyLevel。@Consistency注解已适配为使用DefaultConsistencyLevel。 -
RetryPolicy在QueryOptions和…CqlTemplate类型上已被移除,且无替代方案。 -
驱动程序的
PagingState类型已被移除。 分页状态现在使用ByteBuffer。 -
SimpleUserTypeResolver接受CqlSession而不是Cluster。 -
SimpleTupleTypeFactory已迁移为enum。SimpleTupleTypeFactory.INSTANCE不再需要Cluster/CqlSession上下文。 -
引入
StatementBuilder,以函数式方式构建语句,因为 QueryBuilder API 使用的是不可变的语句类型。 -
Sessionbean 的名称已从session更改为cassandraSession,SessionFactorybean 的名称已从sessionFactory更改为cassandraSessionFactory。 -
ReactiveSessionbean 的名称已从reactiveSession更改为reactiveCassandraSession,ReactiveSessionFactorybean 的名称已从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。 -
KeyspaceIdentifier和CqlIdentifier,请改用com.datastax.oss.driver.api.core.CqlIdentifier。 -
CassandraSessionFactoryBean,请改用CqlSessionFactoryBean。 -
AbstractCqlTemplateConfiguration,请改用AbstractSessionConfiguration。 -
AbstractSessionConfiguration.getClusterName(),请改用AbstractSessionConfiguration.getSessionName()。 -
CodecRegistryTupleTypeFactory,请改用SimpleTupleTypeFactory。 -
Spring Data 的
CqlIdentifier,请改用驱动程序的CqlIdentifier。 -
forceQuote属性已不再需要,因为现在无需再进行引号转义。CqlIdentifier能够正确地转义保留关键字,并处理大小写敏感问题。 -
fetchSize和QueryOptions类型上的…CqlTemplate已被弃用,请改用pageSize -
CassandraMappingContext.setUserTypeResolver(…)、CassandraMappingContext.setCodecRegistry(…)和CassandraMappingContext.setCustomConversions(…):在CassandraConverter上配置这些属性。 -
TupleTypeFactory和CassandraMappingContext.setTupleTypeFactory(…):TupleTypeFactory不再被使用,因为 Cassandra 驱动程序已自带DataTypes.tupleOf(…)工厂方法。 -
通过
CqlSessionFactoryBean(cassandra:session)创建 Schema 已被弃用。 通过CqlSessionFactoryBean(cassandra:session)创建 Keyspace 不受影响。
移除
配置 API
-
PoolingOptionsFactoryBean -
SocketOptionsFactoryBean -
CassandraClusterFactoryBean -
CassandraClusterParser -
CassandraCqlClusterFactoryBean -
CassandraCqlClusterParser -
CassandraCqlSessionParser -
AbstractClusterConfiguration -
ClusterBuilderConfigurer(请改用SessionBuilderConfigurer)
实用工具
-
GuavaListenableFutureAdapter -
QueryOptions和WriteOptions的构造函数接受ConsistencyLevel和RetryPolicy参数。 请结合执行配置文件(execution profiles)使用构建器(builder)作为替代方案。 -
CassandraAccessor.setRetryPolicy(…)和ReactiveCqlTemplate.setRetryPolicy(…)方法。 请使用执行配置文件(execution profiles)作为替代方案。
命名空间支持
-
cql命名空间(www.springframework.org/schema/cql,请改用www.springframework.org/schema/data/cassandra) -
cassandra:cluster(端点属性已合并到cassandra:session) -
cql:template,请改用cassandra:cql-template -
移除了隐式的 Bean 注册,包括 Mapping Context、Context 和 Template API 的 Bean。 这些必须显式声明。