從 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
中的組態項目。這表示 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 和端點。
隨著升級,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>
當使用 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
建立 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 驅動程式 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 使用不可變的陳述式類型。 -
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
屬性,因為不再需要引號。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
-
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 註冊 Mapping Context、Context 和 Template API bean。這些必須明確宣告。