Migration Guide from 2.x to 3.x
-
升级至 DataStax 驱动程序 4,带来了依赖项更改和配置调整。
-
Cluster 和 Session 对象合并,简化了配置。
-
架构支持迁移到 cassandra:session-factory 命名空间元素。
-
映射上下文、上下文和模板 API Bean 需要显式声明。
-
某些数据模型功能(如 @CassandraType)需要更新。
-
代码必须针对 DataStax 驱动程序 4 的 API 更改进行调整。
-
弃用了某些功能,并引入了新的功能(如 StatementBuilder 和 KeyspacePopulator)。
3.0 版用于 Apache Cassandra 的 Spring Data 在从较早版本升级时引入了一组重大更改。
Spring Data for Apache Cassandra 3.0 introduces a set of breaking changes when upgrading from earlier versions.
Review dependencies
升级到 Spring Data Cassandra 需要升级到 DataStax Driver 版本 4。升级到新驱动程序会带来瞬态依赖项更改,最明显的是,Google Guava 已被驱动程序捆绑并遮蔽。有关与驱动程序相关的更改的详细信息,请查看 DataStax Java Driver for Apache Cassandra 4 Upgrade Guide。
Upgrading to Spring Data Cassandra requires an upgrade to the DataStax Driver version 4. Upgrading to the new driver comes with transitive dependency changes, most notably, Google Guava is bundled and shaded by the driver. Check out the DataStax Java Driver for Apache Cassandra 4 Upgrade Guide for details on the Driver-related changes.
Adapt Configuration
DataStax Java Driver 4 将 Cluster
和 Session
对象合并成单个 CqlSession
对象,因此已删除所有与 Cluster
相关的 API。配置已通过移除大多数已移至 DriverConfigLoader
(主要基于文件)中的配置项进行了大范围修订。这意味着现在通过其他方式配置了 SocketOptions
、AddressTranslator
和更多选项。
DataStax Java Driver 4 merges Cluster
and Session
objects into a single CqlSession
object, therefore, all Cluster
-related API was removed.
The configuration was revised in large parts by removing most configuration items that were moved into DriverConfigLoader
that is mostly file-based.
This means that SocketOptions
, AddressTranslator
and many more options are configured now through other means.
如果你使用基于 XML 的配置,请务必将所有配置文件从 cql`名称空间 (`http://www.springframework.org/schema/cql [role="bare"]https://www.springframework.org/schema/cql/spring-cql.xsd
) 迁移到 cassandra`名称空间 (`http://www.springframework.org/schema/data/cassandra [role="bare"]https://www.springframework.org/schema/data/cassandra/spring-cassandra.xsd
)。
If you’re using XML-based configuration, make sure to migrate all configuration files from the cql
namespace (http://www.springframework.org/schema/cql [role="bare"]https://www.springframework.org/schema/cql/spring-cql.xsd
) to the cassandra
namespace (http://www.springframework.org/schema/data/cassandra [role="bare"]https://www.springframework.org/schema/data/cassandra/spring-cassandra.xsd
).
为了反映配置构建器的变更,ClusterBuilderConfigurer
已重命名为 SessionBuilderConfigurer
,现在接受 CqlSessionBuilder
而不是 Cluster.Builder
。请务必在配置中提供本地数据中心,因为它对于正确配置负载平衡是必需的。
To reflect the change in configuration builders, ClusterBuilderConfigurer
was renamed to SessionBuilderConfigurer
accepting now CqlSessionBuilder
instead of the Cluster.Builder
.
Make sure to also provide the local data center in your configuration as it is required to properly configure load balancing.
Connectivity
Cluster
(cassandra:cluster
)和 Session
(cassandra:session
)的配置元素已合并到一个 CqlSession
(cassandra:session
)元素中,该元素配置了键空间和端点。
The configuration elements for Cluster
(cassandra:cluster
) and Session
(cassandra:session
) were merged into a single CqlSession
(cassandra:session
) element that configures both, the keyspace and endpoints.
在升级时,架构支持已移至新的命名空间元素:cassandra:session-factory
,该元素提供了 SessionFactory
Bean。
With the upgrade, schema support was moved to a new namespace element: cassandra:session-factory
that provides a 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 不再注册默认映射上下文、上下文和模板 API bean。应在应用程序或 Spring Boot 级别上应用默认值。 |
Spring Data Cassandra 3.0 no longer registers default Mapping Context, Context and Template API beans when using XML namespace configuration. The defaulting should be applied on application or Spring Boot level. |
Template API
如果你应用程序主要与映射实体或原始 Java 类型进行交互,那么用于 Apache Cassandra 的 Spring Data 封装了大多数随 Driver 升级而来的更改,如 Template API 和存储库支持。
Spring Data for Apache Cassandra encapsulates most of the changes that come with the driver upgrade as the Template API and repository support if your application mainly interacts with mapped entities or primitive Java types.
我们通常建议使用 SessionFactory
创建 CqlTemplate
和 CassandraTemplate
对象,因为工厂用法允许同步以创建架构,并在处理多个数据库时引入了一定程度的灵活性。
We generally recommend to create CqlTemplate
and CassandraTemplate
objects by using SessionFactory
as the factory usage allows synchronization for schema creation and introduces a level of flexibility when working with multiple databases.
<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 Driver API 的地方都必须调整你的代码。典型情况包括:
You will have to adapt your code in all places, where you use DataStax driver API directly. Typical cases include:
-
Implementations of
ResultSetExtractor
-
Implementations of
RowCallbackHandler
-
Implementations of
RowMapper
-
实现
PreparedStatementCreator
,包括异步和反应式变体 -
Implementations of
PreparedStatementCreator
including async and reactive variants -
Calls to
CqlTemplate.queryForResultSet(…)
-
调用接受
Statement
的方法 -
Calling methods that accept
Statement
Changes in AsyncCqlTemplate
DataStax Driver 4 已更改了异步运行的查询的结果类型。为了反映这些更改,你需要调整你的代码,以提供:
DataStax driver 4 has changed the result type of queries that are run asynchronously. To reflect these changes, you need to adapt your code that provides:
-
Implementations of
AsyncSessionCallback
-
Implementations of
AsyncPreparedStatementCreator
结果集提取需要一个新接口,用于 DataStax 的 AsyncResultSet
。现 AsyncCqlTemplate
在它以前使用 ResultSetExtractor
的位置使用 AsyncResultSetExtractor
。请注意,AsyncResultSetExtractor.extractData(…)
返回 Future
而不是标量对象,因此代码迁移为提取器使用完全非阻塞代码提供了可能性。
Result set extraction requires a new interface for DataStax' AsyncResultSet
.
AsyncCqlTemplate
now uses AsyncResultSetExtractor
in places where it used previously ResultSetExtractor
.
Note that AsyncResultSetExtractor.extractData(…)
returns a Future
instead of a scalar object so a migration of code comes with the possibility to use fully non-blocking code in the extractor.
Data model migrations
如果使用以下功能,则你的数据模型可能需要更新:
Your data model may require updates if you use the following features:
-
@CassandraType
-
forceQuote
中的@Table
、@Column
、@PrimaryKeyColumn
、@PrimaryKey
和@UserDefinedType
-
forceQuote
in@Table
,@Column
,@PrimaryKeyColumn
,@PrimaryKey
and@UserDefinedType
-
Properties using
java.lang.Date
-
使用
UDTValue
或TupleValue
的属性 -
Properties using
UDTValue
orTupleValue
@CassandraType
DataStax Driver 4 不再使用 Name
枚举来描述 Cassandra 类型。我们决定使用 CassandraType.Name
重新引入枚举。请务必更新你的导入以使用新引入的替换类型。
DataStax driver 4 no longer ships with a Name
enumeration to describe the Cassandra type.
We decided to re-introduce the enumeration with CassandraType.Name
.
Make sure to update your imports to use the newly introduced replacement type.
Force Quote
此标志现已弃用,我们建议不再使用。针对 Apache Cassandra 的 Spring Data 在内部使用驱动程序的 CqlIdentifier
,它确保在需要时加上引号。
This flag is now deprecated, and we recommend not to use it any longer.
Spring Data for Apache Cassandra internally uses the driver’s CqlIdentifier
that ensures quoting where it’s required.
Property Types
DataStax 驱动程序 4 不再使用 java.lang.Date
。请升级你的数据模型,使用 java.time.LocalDateTime
。请还将原始 UDT 和元祖类型迁移到新的驱动程序类型 UdtValue
和 TupleValue
。
DataStax driver 4 no longer uses java.lang.Date
.
Please upgrade your data model to use java.time.LocalDateTime
.
Please also migrate raw UDT and tuple types to the new driver types UdtValue
respective TupleValue
.
Other changes
-
驱动程序的
ConsistencyLevel
常量类已被删除并重新引入为DefaultConsistencyLevel
。@Consistency
已调整为DefaultConsistencyLevel
。 -
Driver’s
ConsistencyLevel
constant class was removed and reintroduced asDefaultConsistencyLevel
.@Consistency
was adapted toDefaultConsistencyLevel
. -
RetryPolicy
中QueryOptions
和…CqlTemplate
类型的类型已被删除,未替换。 -
RetryPolicy
onQueryOptions
and…CqlTemplate
types was removed without replacement. -
驱动程序的
PagingState
类型已删除。分页状态现在使用ByteBuffer
。 -
Drivers’s
PagingState
type was removed. Paging state now usesByteBuffer
. -
SimpleUserTypeResolver
接受CqlSession
而不是Cluster
。 -
SimpleUserTypeResolver
acceptsCqlSession
instead ofCluster
. -
SimpleTupleTypeFactory
已迁移到enum
。SimpleTupleTypeFactory.INSTANCE
不再需要Cluster
/CqlSession
上下文。 -
SimpleTupleTypeFactory
was migrated toenum
.SimpleTupleTypeFactory.INSTANCE
no longer requires aCluster
/CqlSession
context. -
引入
StatementBuilder
来构建函数式语句,因为 QueryBuilder API 使用不可变语句类型。 -
Introduction of
StatementBuilder
to functionally build statements as the QueryBuilder API uses immutable statement types. -
Session
bean 从session
重命名为cassandraSession
,SessionFactory
bean 从sessionFactory
重命名为cassandraSessionFactory
。 -
Session
bean renamed fromsession
tocassandraSession
andSessionFactory
bean renamed fromsessionFactory
tocassandraSessionFactory
. -
ReactiveSession
bean 从reactiveSession
重命名为reactiveCassandraSession
,ReactiveSessionFactory
bean 从reactiveSessionFactory
重命名为reactiveCassandraSessionFactory
。 -
ReactiveSession
bean renamed fromreactiveSession
toreactiveCassandraSession
andReactiveSessionFactory
bean renamed fromreactiveSessionFactory
toreactiveCassandraSessionFactory
. -
ReactiveSessionFactory.getSession()
现在返回Mono<ReactiveSession>
。以前它只返回ReactiveSession
。 -
ReactiveSessionFactory.getSession()
now returns aMono<ReactiveSession>
. Previously it returned justReactiveSession
. -
数据类型解析已移入
ColumnTypeResolver
,因此所有DataType
相关方法都从CassandraPersistentEntity
/CassandraPersistentProperty
移动到ColumnTypeResolver
(受影响方法为MappingContext.getDataType(…)
、CassandraPersistentProperty.getDataType()
、CassandraPersistentEntity.getUserType()
和CassandraPersistentEntity.getTupleType()
)。 -
Data type resolution was moved into
ColumnTypeResolver
so allDataType
-related methods were moved fromCassandraPersistentEntity
/CassandraPersistentProperty
intoColumnTypeResolver
(affected methods areMappingContext.getDataType(…)
,CassandraPersistentProperty.getDataType()
,CassandraPersistentEntity.getUserType()
, andCassandraPersistentEntity.getTupleType()
). -
架构创建已从
MappingContext
移动到SchemaFactory
(受影响方法为CassandraMappingContext.getCreateTableSpecificationFor(…)
、CassandraMappingContext.getCreateIndexSpecificationsFor(…)
和CassandraMappingContext.getCreateUserTypeSpecificationFor(…)
)。 -
Schema creation was moved from
MappingContext
toSchemaFactory
(affected methods areCassandraMappingContext.getCreateTableSpecificationFor(…)
,CassandraMappingContext.getCreateIndexSpecificationsFor(…)
, andCassandraMappingContext.getCreateUserTypeSpecificationFor(…)
).
Deprecations
-
CassandraCqlSessionFactoryBean
, useCqlSessionFactoryBean
instead. -
KeyspaceIdentifier
和CqlIdentifier
,改为使用com.datastax.oss.driver.api.core.CqlIdentifier
。 -
KeyspaceIdentifier
andCqlIdentifier
, usecom.datastax.oss.driver.api.core.CqlIdentifier
instead. -
CassandraSessionFactoryBean
, useCqlSessionFactoryBean
instead. -
AbstractCqlTemplateConfiguration
, useAbstractSessionConfiguration
instead. -
AbstractSessionConfiguration.getClusterName()
, useAbstractSessionConfiguration.getSessionName()
instead. -
CodecRegistryTupleTypeFactory
, useSimpleTupleTypeFactory
instead. -
Spring Data 的
CqlIdentifier
,改为使用驱动程序CqlIdentifier
。 -
Spring Data’s
CqlIdentifier
, use the driverCqlIdentifier
instead. -
forceQuote
属性因为引用不再是必需的。CqlIdentifier
正确转义保留的关键字并注意大小写敏感性。 -
forceQuote
attributes as quoting is no longer required.CqlIdentifier
properly escapes reserved keywords and takes care of case-sensitivity. -
fetchSize
inQueryOptions
和…CqlTemplate
类型已弃用,请使用pageSize
-
fetchSize
onQueryOptions
and…CqlTemplate
types was deprecated, usepageSize
instead -
CassandraMappingContext.setUserTypeResolver(…)
、CassandraMappingContext.setCodecRegistry(…)
和CassandraMappingContext.setCustomConversions(…)
:在CassandraConverter
上配置这些属性。 -
CassandraMappingContext.setUserTypeResolver(…)
,CassandraMappingContext.setCodecRegistry(…)
, andCassandraMappingContext.setCustomConversions(…)
: Configure these properties onCassandraConverter
. -
TupleTypeFactory
和CassandraMappingContext.setTupleTypeFactory(…)
:TupleTypeFactory
不再使用,因为 Cassandra 驱动程序提供了一个DataTypes.tupleOf(…)
工厂方法。 -
TupleTypeFactory
andCassandraMappingContext.setTupleTypeFactory(…)
:TupleTypeFactory
is no longer used as the Cassandra driver ships with aDataTypes.tupleOf(…)
factory method. -
通过
CqlSessionFactoryBean
(cassandra:session
)创建 Schema 已弃用而通过CqlSessionFactoryBean
(cassandra:session
)创建 Keyspace 不会受到影响。 -
Schema creation via
CqlSessionFactoryBean
(cassandra:session
) is deprecated. Keyspace creation viaCqlSessionFactoryBean
(cassandra:session
) is not affected.
Removals
Configuration API
-
PoolingOptionsFactoryBean
-
SocketOptionsFactoryBean
-
CassandraClusterFactoryBean
-
CassandraClusterParser
-
CassandraCqlClusterFactoryBean
-
CassandraCqlClusterParser
-
CassandraCqlSessionParser
-
AbstractClusterConfiguration
-
ClusterBuilderConfigurer
(useSessionBuilderConfigurer
instead
Utilities
-
GuavaListenableFutureAdapter
-
QueryOptions
和WriteOptions
构造函数获取ConsistencyLevel
和RetryPolicy
参数。使用构建器结合执行配置文件作为替换。 -
QueryOptions
andWriteOptions
constructor takingConsistencyLevel
andRetryPolicy
arguments. Use the builder in conjunction of execution profiles as replacement. -
CassandraAccessor.setRetryPolicy(…)
和ReactiveCqlTemplate.setRetryPolicy(…)
方法。使用执行配置文件作为替换。 -
CassandraAccessor.setRetryPolicy(…)
andReactiveCqlTemplate.setRetryPolicy(…)
methods. Use execution profiles as replacement.
Namespace support
-
cql
命名空间(http://www.springframework.org/schema/cql
,请改为使用http://www.springframework.org/schema/data/cassandra
) -
cql
namespace (http://www.springframework.org/schema/cql
, usehttp://www.springframework.org/schema/data/cassandra
instead) -
cassandra:cluster
(端点属性合并到cassandra:session
) -
cassandra:cluster
(endpoint properties merged tocassandra:session
) -
cql:template
, usecassandra:cql-template
instead -
删除了隐式 Bean 注册映射上下文、上下文和模板 API Bean。这些必须显式声明。
-
Removed implicit bean registrations Mapping Context, Context and Template API beans. These must be declared explicitly.
Additions
Configuration API
-
CqlSessionFactoryBean
-
InitializeKeyspaceBeanDefinitionParser
-
SessionFactoryFactoryBean
(包括通过KeyspacePopulator
创建 Schema) -
SessionFactoryFactoryBean
including schema creation viaKeyspacePopulator
-
KeyspacePopulator
和SessionFactoryInitializer
来初始化一个键空间 -
KeyspacePopulator
andSessionFactoryInitializer
to initialize a keyspace