從 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 中的組態項目。這表示 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) 元素,該元素同時組態 keyspace 和端點。

隨著升級,schema 支援已移至新的命名空間元素:cassandra:session-factory,它提供 SessionFactory bean。

範例 1. 版本 2 中的叢集、Session 和 Schema 組態
<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 中的 Session 和 Schema 組態
<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 層級套用。

Template API

如果您應用程式主要與對應實體或原始 Java 類型互動,Spring Data for Apache Cassandra 會封裝驅動程式升級帶來的大部分變更,例如 Template API 和儲存庫支援。

我們通常建議使用 SessionFactory 建立 CqlTemplateCassandraTemplate 物件,因為工廠用法允許 schema 建立的同步,並在處理多個資料庫時引入一定程度的彈性。

範例 3. 版本 2 中的 Template API 組態
<cql:template session-ref="…" />

<cassandra:template session-ref="…" cassandra-converter-ref="…"/>
範例 4. 版本 3 中的 Template 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

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

  • 使用 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 和 tuple 類型遷移到新的驅動程式類型 UdtValueTupleValue

其他變更

  • 驅動程式的 ConsistencyLevel 常數類別已移除,並重新引入為 DefaultConsistencyLevel@Consistency 已調整為 DefaultConsistencyLevel

  • QueryOptions…CqlTemplate 類型上的 RetryPolicy 已移除,沒有替代方案。

  • 驅動程式的 PagingState 類型已移除。分頁狀態現在使用 ByteBuffer

  • SimpleUserTypeResolver 接受 CqlSession 而不是 Cluster

  • SimpleTupleTypeFactory 已遷移到 enumSimpleTupleTypeFactory.INSTANCE 不再需要 Cluster/CqlSession 內容。

  • 引入 StatementBuilder 以功能性地建構陳述式,因為 QueryBuilder API 使用不可變的陳述式類型。

  • Session bean 從 session 重新命名為 cassandraSession,而 SessionFactory bean 從 sessionFactory 重新命名為 cassandraSessionFactory

  • ReactiveSession bean 從 reactiveSession 重新命名為 reactiveCassandraSession,而 ReactiveSessionFactory bean 從 reactiveSessionFactory 重新命名為 reactiveCassandraSessionFactory

  • ReactiveSessionFactory.getSession() 現在回傳 Mono<ReactiveSession>。先前它只回傳 ReactiveSession

  • 資料類型解析已移至 ColumnTypeResolver,因此所有與 DataType 相關的方法都從 CassandraPersistentEntity/CassandraPersistentProperty 移至 ColumnTypeResolver (受影響的方法為 MappingContext.getDataType(…)CassandraPersistentProperty.getDataType()CassandraPersistentEntity.getUserType()CassandraPersistentEntity.getTupleType())。

  • Schema 建立已從 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) 建立 Schema 已棄用。透過 CqlSessionFactoryBean (cassandra:session) 建立 Keyspace 不受影響。

移除

組態 API

  • PoolingOptionsFactoryBean

  • SocketOptionsFactoryBean

  • CassandraClusterFactoryBean

  • CassandraClusterParser

  • CassandraCqlClusterFactoryBean

  • CassandraCqlClusterParser

  • CassandraCqlSessionParser

  • AbstractClusterConfiguration

  • ClusterBuilderConfigurer (請改用 SessionBuilderConfigurer

公用程式

  • GuavaListenableFutureAdapter

  • QueryOptionsWriteOptions 建構子,採用 ConsistencyLevelRetryPolicy 引數。使用執行設定檔的建構器作為替代方案。

  • CassandraAccessor.setRetryPolicy(…)ReactiveCqlTemplate.setRetryPolicy(…) 方法。使用執行設定檔作為替代方案。

命名空間支援

新增

組態 API

  • CqlSessionFactoryBean

  • InitializeKeyspaceBeanDefinitionParser

  • SessionFactoryFactoryBean,包括透過 KeyspacePopulator 建立 schema

  • KeyspacePopulatorSessionFactoryInitializer 以初始化 keyspace

命名空間支援

  • cassandra:cluster (端點屬性已合併到 cassandra:session)

  • cassandra:initialize-keyspace 命名空間支援

  • 具有 cassandra:script 支援的 cassandra:session-factory