10.3.1.使用基于 Java 的元數(shù)據(jù)注冊 Session 實例
您可以使用Java 配置類來配置響應(yīng)式 Cassandra 支持。CqlSession響應(yīng)式Cassandra 支持改編為在異步驅(qū)動程序之上提供響應(yīng)式處理模型。
反應(yīng)式CqlSession的配置類似于命令式CqlSession。我們提供帶有預(yù)定義默認(rèn)值的支持配置類,并且只需要特定于環(huán)境的信息來為 Apache Cassandra 配置 Spring Data。反應(yīng)式支持的基類是
AbstractReactiveCassandraConfiguration. 這個配置類擴(kuò)展了命令式AbstractCassandraConfiguration,所以反應(yīng)式支持也配置了命令式 API 支持。以下示例顯示如何在配置類中注冊 Apache Cassandra bean: ReactiveAppCassandraConfiguration .Registering Spring Data for Apache Cassandra beans usingAbstractReactiveCassandraConfiguration
@Configurationpublic class ReactiveCassandraConfiguration extends AbstractReactiveCassandraConfiguration { /*
* Provide a contact point to the configuration.
*/
public String getContactPoints() { return "localhost";
} /*
* Provide a keyspace name to the configuration.
*/
public String getKeyspaceName() { return "mykeyspace";
}
}前面示例中的配置類啟用了模式管理以在啟動期間創(chuàng)建 CQL 對象。有關(guān)更多詳細(xì)信息,請參閱架構(gòu)管理。
10.4.ReactiveCqlTemplate
的ReactiveCqlTemplate類是在芯CQL包的核心類。它處理資源的創(chuàng)建和釋放。它執(zhí)行核心 CQL 工作流的基本任務(wù),例如創(chuàng)建和運(yùn)行語句,留下應(yīng)用程序代碼以提供 CQL 和提取結(jié)果。該ReactiveCqlTemplate班運(yùn)行CQL的查詢和更新語句,并在執(zhí)行迭代ResultSet情況下,返回的參數(shù)值的提取。它還捕獲 CQL 異常并將它們轉(zhuǎn)換為org.springframework.dao包中定義的通用的、信息更豐富的異常層次結(jié)構(gòu)。
當(dāng)你ReactiveCqlTemplate在你的代碼中使用 時,你只需要實現(xiàn)回調(diào)接口,它有一個明確定義的契約。給定 a Connection,
ReactivePreparedStatementCreator回調(diào)接口使用提供的 CQL 和任何必要的參數(shù)參數(shù)創(chuàng)建一個準(zhǔn)備好的語句。該RowCallbackHandler 接口從 a 的每一行中提取值ReactiveResultSet。
ReactiveCqlTemplate可以通過ReactiveSessionFactory 引用直接實例化在 DAO 實現(xiàn)中使用,也可以在 Spring 容器中配置并作為 bean 引用提供給 DAO。ReactiveCqlTemplate是
ReactiveCassandraTemplate.
此類發(fā)布的所有 CQL 都記錄在與DEBUG模板實例的完全限定類名對應(yīng)的類別下的級別(通常為ReactiveCqlTemplate,但如果您使用ReactiveCqlTemplate該類的自定義子類,則可能會有所不同)。
10.4.1.ReactiveCqlTemplate類使用示例
本節(jié)提供了一些ReactiveCqlTemplate類使用示例。這些示例并不是ReactiveCqlTemplate. 請參閱隨附的 Javadocs。
查詢 (SELECT) 與ReactiveCqlTemplate
以下查詢獲取關(guān)系中的行數(shù):
Mono<Integer> rowCount = reactiveCqlTemplate.queryForObject("SELECT COUNT(*) FROM t_actor", Integer.class);以下查詢使用綁定變量:
Mono<Integer> countOfActorsNamedJoe = reactiveCqlTemplate.queryForObject( "SELECT COUNT(*) FROM t_actor WHERE first_name = ?", Integer.class, "Joe");
以下示例查詢 a String:
Mono<String> lastName = reactiveCqlTemplate.queryForObject( "SELECT last_name FROM t_actor WHERE id = ?", String.class, 1212L);
以下示例查詢并填充單個域?qū)ο螅?/p>
Mono<Actor> actor = reactiveCqlTemplate.queryForObject( "SELECT first_name, last_name FROM t_actor WHERE id = ?", new RowMapper<Actor>() { public Actor mapRow(Row row, int rowNum) {
Actor actor = new Actor();
actor.setFirstName(row.getString("first_name"));
actor.setLastName(row.getString("last_name")); return actor;
}}, 1212L);以下示例查詢并填充多個域?qū)ο螅?/p>
Flux<Actor> actors = reactiveCqlTemplate.query("SELECT first_name, last_name FROM t_actor", new RowMapper<Actor>() { public Actor mapRow(Row row, int rowNum) {
Actor actor = new Actor();
actor.setFirstName(row.getString("first_name"));
actor.setLastName(row.getString("last_name")); return actor;
}
});如果最后兩個代碼片段確實存在于同一個應(yīng)用程序中,那么刪除兩個RowMapper匿名內(nèi)部類中存在的重復(fù)并將它們提取到一個類(通常是static嵌套類)中是有意義的,然后可以由 DAO 方法引用如所須。
例如,將最后一個代碼片段編寫如下可能會更好:
Flux<Actor> findAllActors() { return reactiveCqlTemplate.query("SELECT first_name, last_name FROM t_actor", ActorMapper.INSTANCE);
}enum ActorMapper implements RowMapper<Actor> {
INSTANCE; public Actor mapRow(Row row, int rowNum) {
Actor actor = new Actor();
actor.setFirstName(row.getString("first_name"));
actor.setLastName(row.getString("last_name")); return actor;
}
}INSERT,UPDATE以及DELETE用ReactiveCqlTemplate
您可以使用該execute(…)方法來執(zhí)行INSERT,UPDATE和DELETE操作。參數(shù)值通常作為可變參數(shù)提供,或者作為對象數(shù)組提供。
以下示例顯示如何使用 執(zhí)行INSERT操作ReactiveCqlTemplate:
Mono<Boolean> applied = reactiveCqlTemplate.execute( "INSERT INTO t_actor (first_name, last_name) VALUES (?, ?)", "Leonor", "Watling");
以下示例顯示如何使用 執(zhí)行UPDATE操作ReactiveCqlTemplate:
Mono<Boolean> applied = reactiveCqlTemplate.execute( "UPDATE t_actor SET last_name = ? WHERE id = ?", "Banjo", 5276L);
以下示例顯示如何使用 執(zhí)行DELETE操作ReactiveCqlTemplate:
Mono<Boolean> applied = reactiveCqlTemplate.execute( "DELETE FROM actor WHERE id = ?", actorId);
10.5.異常翻譯
Spring Framework 為各種數(shù)據(jù)庫和映射技術(shù)提供異常轉(zhuǎn)換。這在傳統(tǒng)上用于 JDBC 和 JPA。Spring Data for Apache Cassandra 通過提供
org.springframework.dao.support.PersistenceExceptionTranslator接口的實現(xiàn)將此功能擴(kuò)展到 Apache Cassandra 。
映射到 Spring 的一致數(shù)據(jù)訪問異常層次結(jié)構(gòu)背后的動機(jī) 是讓您編寫可移植和描述性的異常處理代碼,而無需針對特定的 Cassandra 異常進(jìn)行編碼和處理。Spring 的所有數(shù)據(jù)訪問異常都繼承自 DataAccessException該類,因此您可以確保可以在單個 try-catch 塊中捕獲所有與數(shù)據(jù)庫相關(guān)的異常。
ReactiveCqlTemplate并ReactiveCassandraTemplate盡早傳播異常。在處理反應(yīng)序列期間出現(xiàn)的異常作為錯誤信號發(fā)出。
10.6.簡介ReactiveCassandraTemplate
該ReactiveCassandraTemplate班,地處
org.springframework.data.cassandra包,是在Spring Data的卡桑德拉支持的核心類。它提供了豐富的功能集來與數(shù)據(jù)庫交互。該模板提供方便的數(shù)據(jù)訪問操作來創(chuàng)建、更新、刪除和查詢 Cassandra,并提供域?qū)ο蠛?Cassandra 表行之間的映射。
配置后,ReactiveCassandraTemplate就是線程安全的,可以跨多個實例重復(fù)使用。
Cassandra 表中的行和域類之間的映射是通過委托給CassandraConverter接口的實現(xiàn)來完成的。Spring 提供了默認(rèn)實現(xiàn),MappingCassandraConverter但您也可以編寫自己的自定義轉(zhuǎn)換器。有關(guān)更多詳細(xì)信息,請參閱“映射”。
本ReactiveCassandraTemplate類實現(xiàn)了
ReactiveCassandraOperations接口。方法名稱盡可能ReactiveCassandraOperations與 Cassandra 中的名稱匹配,以使熟悉 Cassandra 的開發(fā)人員熟悉 API。
例如,你可以找到方法,例如select,insert,delete,和update。設(shè)計目標(biāo)是盡可能輕松地在基本 Cassandra 驅(qū)動程序和
ReactiveCassandraOperations. 兩個 API 之間的主要區(qū)別是ReactiveCassandraOperations可以傳遞域?qū)ο蠖皇?CQL 和查詢對象。
在ReactiveCassandraTemplate實例上引用操作的首選方法是通過其接口
ReactiveCassandraOperations.
的默認(rèn)轉(zhuǎn)換器實現(xiàn)ReactiveCassandraTemplate是
MappingCassandraConverter. 雖然MappingCassandraConverter可以使用附加元數(shù)據(jù)來指定對象到行的映射,但它也可以通過使用字段和表名稱映射的約定來轉(zhuǎn)換不包含附加元數(shù)據(jù)的對象。這些約定以及映射注釋的使用在“映射”中進(jìn)行了解釋。
的另一個核心特征CassandraTemplate是異常翻譯。Cassandra Java 驅(qū)動程序拋出的異常被轉(zhuǎn)換為 Spring 的可移植數(shù)據(jù)訪問異常層次結(jié)構(gòu)。有關(guān)更多信息,請參閱“異常翻譯”。
10.6.1.實例化ReactiveCassandraTemplate
ReactiveCassandraTemplate應(yīng)該始終配置為 Spring bean,盡管前面的示例顯示了如何直接實例化它。但是,本節(jié)假定模板在 Spring 模塊中使用,因此也假定正在使用 Spring 容器。
有兩種方法可以獲取 a ReactiveCassandraTemplate,具體取決于您加載 Spring 的方式ApplicationContext:
自動裝配
Bean 查找 ApplicationContext
自動裝配
您可以將 a 自動裝配ReactiveCassandraTemplate到您的項目中,如以下示例所示:
@Autowiredprivate ReactiveCassandraOperations reactiveCassandraOperations;
像所有的春天自動連接,這是假定只有一個bean類型的
ReactiveCassandraOperations中ApplicationContext。如果您有多個ReactiveCassandraTemplatebean(如果您在同一個項目中使用多個鍵空間就可能是這種情況),那么您可以使用@Qualifier注釋來指定要自動裝配的 bean。
@Autowired@Qualifier("keyspaceTwoTemplateBeanId")
private ReactiveCassandraOperations reactiveCassandraOperations;Bean 查找ApplicationContext
您還可以ReactiveCassandraTemplate從 中查找bean ApplicationContext,如以下示例所示:
ReactiveCassandraOperations reactiveCassandraOperations = applicationContext.getBean("reactiveCassandraOperations", ReactiveCassand



