從 2.x 遷移到 3.x 指南
Spring Data for Apache Cassandra 3.0 在從早期版本升級時引入了一系列重大變更。
檢視依賴項
升級到 Spring Data Cassandra 需要升級到 DataStax Driver 4 版本。升級到新驅動程式會帶來傳遞性依賴項變更,最值得注意的是,Google Guava 被驅動程式捆綁和混淆(shaded)。請查閱 DataStax Java Driver for Apache Cassandra 4 升級指南 以瞭解驅動程式相關變更的詳細資訊。
調整配置
DataStax Java Driver 4 將 Cluster
和 Session
物件合併為一個 CqlSession
物件,因此所有 Cluster
相關的 API 都已被移除。配置在很大程度上被修訂,移除了大多數配置項,這些配置項已移至主要基於檔案的 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
) 元素,該元素同時配置 keyspace 和 endpoints。
隨著升級,schema 支援已移至一個新的名稱空間元素: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 名稱空間配置時不再註冊預設的 Mapping Context、Context 和 Template API bean。預設設定應在應用程式或 Spring Boot 層面應用。 |
Template API
如果您的應用程式主要與對映實體或 Java 基本型別互動,Spring Data for Apache Cassandra 會將驅動程序升級帶來的大多數變化封裝在 Template API 和 repository 支援中。
我們通常建議使用 SessionFactory
來建立 CqlTemplate
和 CassandraTemplate
物件,因為工廠的使用允許 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 driver 4 改變了非同步執行查詢的結果型別。為了反映這些變化,您需要調整提供以下功能的程式碼
-
AsyncSessionCallback
的實現 -
AsyncPreparedStatementCreator
的實現
結果集提取需要 DataStax 的 AsyncResultSet
的新介面。AsyncCqlTemplate
現在在使用之前使用 ResultSetExtractor
的地方使用 AsyncResultSetExtractor
。請注意,AsyncResultSetExtractor.extractData(…)
返回一個 Future
而不是標量物件,因此程式碼遷移帶來了在提取器中使用完全非阻塞程式碼的可能性。
資料模型遷移
如果您使用以下特性,您的資料模型可能需要更新
-
@CassandraType
-
forceQuote
在@Table
,@Column
,@PrimaryKeyColumn
,@PrimaryKey
和@UserDefinedType
中 -
使用
java.lang.Date
的屬性 -
使用
UDTValue
或TupleValue
的屬性
@CassandraType
DataStax driver 4 不再附帶用於描述 Cassandra 型別的 Name
列舉。我們決定透過 CassandraType.Name
重新引入該列舉。請確保更新您的匯入以使用新引入的替代型別。
其他變化
-
驅動程式的
ConsistencyLevel
常量類已被移除,並作為DefaultConsistencyLevel
重新引入。@Consistency
已適配DefaultConsistencyLevel
。 -
QueryOptions
和…CqlTemplate
型別上的RetryPolicy
已被移除,沒有替代。 -
驅動程式的
PagingState
型別已被移除。分頁狀態現在使用ByteBuffer
。 -
SimpleUserTypeResolver
現在接受CqlSession
而不是Cluster
。 -
SimpleTupleTypeFactory
已遷移到enum
。SimpleTupleTypeFactory.INSTANCE
不再需要Cluster
/CqlSession
上下文。 -
引入
StatementBuilder
以函式式構建 statements,因為 QueryBuilder API 使用不可變 statement 型別。 -
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
。 -
KeyspaceIdentifier
和CqlIdentifier
,請改用com.datastax.oss.driver.api.core.CqlIdentifier
。 -
CassandraSessionFactoryBean
,請改用CqlSessionFactoryBean
。 -
AbstractCqlTemplateConfiguration
,請改用AbstractSessionConfiguration
。 -
AbstractSessionConfiguration.getClusterName()
,請改用AbstractSessionConfiguration.getSessionName()
。 -
CodecRegistryTupleTypeFactory
,請改用SimpleTupleTypeFactory
。 -
Spring Data 的
CqlIdentifier
,請改用驅動程式的CqlIdentifier
。 -
forceQuote
屬性,因為不再需要引用(quoting)。CqlIdentifier
會正確轉義保留關鍵字並處理大小寫敏感性。 -
QueryOptions
和…CqlTemplate
型別上的fetchSize
已被棄用,請改用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
-
接受
ConsistencyLevel
和RetryPolicy
引數的QueryOptions
和WriteOptions
建構函式。請結合執行配置檔案使用構建器作為替代。 -
CassandraAccessor.setRetryPolicy(…)
和ReactiveCqlTemplate.setRetryPolicy(…)
方法。請使用執行配置檔案作為替代。
名稱空間支援
-
cql
名稱空間(www.springframework.org/schema/cql
,請改用www.springframework.org/schema/data/cassandra
) -
cassandra:cluster
(endpoint 屬性已合併到cassandra:session
) -
cql:template
,請改用cassandra:cql-template
-
移除了隱式註冊的 Mapping Context、Context 和 Template API bean。這些必須顯式宣告。