從 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 將 Cluster 和 Session 物件合併到一個 CqlSession 物件中,因此,所有 Cluster 相關 API 都已刪除。配置在很大程度上進行了修訂,刪除了大部分已移入 DriverConfigLoader 的配置項,而 DriverConfigLoader 大部分是基於檔案的。這意味著 SocketOptions、AddressTranslator 和更多選項現在透過其他方式進行配置。
如果您正在使用基於 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。
<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>
| Spring Data Cassandra 3.0 在使用 XML 名稱空間配置時不再註冊預設的對映上下文、上下文和模板 API bean。預設值應在應用程式或 Spring Boot 級別應用。 |
模板 API
如果您的應用程式主要與對映實體或基本 Java 型別互動,Spring Data for Apache Cassandra 封裝了大部分隨驅動程序升級而來的更改,包括模板 API 和儲存庫支援。
我們通常建議使用 SessionFactory 建立 CqlTemplate 和 CassandraTemplate 物件,因為工廠使用允許模式建立同步,並在使用多個數據庫時引入了一定程度的靈活性。
<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 現在在以前使用 ResultSetExtractor 的地方使用 AsyncResultSetExtractor。請注意,AsyncResultSetExtractor.extractData(…) 返回一個 Future 而不是標量物件,因此程式碼遷移帶來了在提取器中使用完全非阻塞程式碼的可能性。
資料模型遷移
其他更改
-
驅動程式的
ConsistencyLevel常量類已刪除,並重新引入為DefaultConsistencyLevel。@Consistency已適配為DefaultConsistencyLevel。 -
QueryOptions和…CqlTemplate型別上的RetryPolicy已刪除,沒有替代品。 -
驅動程式的
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正確轉義保留關鍵字並處理大小寫敏感性。 -
QueryOptions和…CqlTemplate型別上的fetchSize已棄用,請改用pageSize。 -
CassandraMappingContext.setUserTypeResolver(…)、CassandraMappingContext.setCodecRegistry(…)和CassandraMappingContext.setCustomConversions(…):在CassandraConverter上配置這些屬性。 -
TupleTypeFactory和CassandraMappingContext.setTupleTypeFactory(…):TupleTypeFactory不再使用,因為 Cassandra 驅動程式附帶了一個DataTypes.tupleOf(…)工廠方法。 -
透過
CqlSessionFactoryBean(cassandra:session) 建立模式已棄用。透過CqlSessionFactoryBean(cassandra:session) 建立鍵空間不受影響。
移除
配置 API
-
PoolingOptionsFactoryBean -
SocketOptionsFactoryBean -
CassandraClusterFactoryBean -
CassandraClusterParser -
CassandraCqlClusterFactoryBean -
CassandraCqlClusterParser -
CassandraCqlSessionParser -
AbstractClusterConfiguration -
ClusterBuilderConfigurer(請改用SessionBuilderConfigurer)
實用程式
-
GuavaListenableFutureAdapter -
QueryOptions和WriteOptions建構函式接受ConsistencyLevel和RetryPolicy引數。請改用構建器結合執行配置檔案。 -
CassandraAccessor.setRetryPolicy(…)和ReactiveCqlTemplate.setRetryPolicy(…)方法。請改用執行配置檔案。
名稱空間支援
-
cql名稱空間 (www.springframework.org/schema/cql,請改用www.springframework.org/schema/data/cassandra) -
cassandra:cluster(端點屬性合併到cassandra:session) -
cql:template,請改用cassandra:cql-template -
移除了隱式 bean 註冊的對映上下文、上下文和模板 API bean。這些必須顯式宣告。