跳到主要内容
版本:5.1.1

使用 Spring 连接 Cassandra

Doubao 中英对照 Connecting to Cassandra with Spring

在 Spring 中使用 Apache Cassandra 的首要任务之一,是通过 Spring IoC 容器创建一个 com.datastax.oss.driver.api.core.CqlSession 对象。您可以使用基于 Java 的 bean 元数据,也可以使用基于 XML 的 bean 元数据来完成。以下各节将对此进行讨论。

备注

对于那些不熟悉如何使用基于 Java 的 bean 元数据(而非基于 XML 的元数据)配置 Spring 容器的读者,请参阅参考文档中的总体介绍以及详细文档。

使用基于 Java 的元数据注册会话实例​

以下示例展示了如何使用基于 Java 的 bean 元数据注册一个 com.datastax.oss.driver.api.core.CqlSession 实例:

示例 1. 使用基于 Java 的 bean 元数据注册一个 com.datastax.oss.driver.api.core.CqlSession 对象

@Configuration
public class AppConfig {

/*
* Use the standard Cassandra driver API to create a com.datastax.oss.driver.api.core.CqlSession instance.
*/
public @Bean CqlSession session() {
return CqlSession.builder().withKeyspace("mykeyspace").build();
}
}

这种方式让您可以使用您可能已经熟悉的标准 com.datastax.oss.driver.api.core.CqlSession API。

另一种方式是使用 Spring 的 CqlSessionFactoryBean 向容器注册一个 com.datastax.oss.driver.api.core.CqlSession 实例。与直接实例化 com.datastax.oss.driver.api.core.CqlSession 实例相比,FactoryBean 方式的额外优势在于,它还为容器提供了一个 ExceptionTranslator 实现,可将 Cassandra 异常转换为 Spring 可移植的 DataAccessException 层次结构中的异常。该层次结构以及 @Repository 的使用在 Spring 的 DAO 支持特性中有描述。

以下示例展示了基于 Java 的工厂类的用法:

示例 2. 使用 Spring 的 CqlSessionFactoryBean 注册一个 com.datastax.oss.driver.api.core.CqlSession 对象:

@Configuration
public class FactoryBeanAppConfig {

/*
* Factory bean that creates the com.datastax.oss.driver.api.core.CqlSession instance
*/
@Bean
public CqlSessionFactoryBean session() {

CqlSessionFactoryBean session = new CqlSessionFactoryBean();
session.setContactPoints("localhost");
session.setKeyspaceName("mykeyspace");

return session;
}
}

将 CassandraTemplate 用于对象映射和仓库支持,需要一个 CassandraTemplate、CassandraMappingContext、CassandraConverter,并启用仓库支持。

以下示例展示了如何注册组件以配置对象映射和仓库支持:

示例 3. 注册组件以配置对象映射和仓库支持

@Configuration
@EnableCassandraRepositories(basePackages = { "org.springframework.data.cassandra.example" })
public class CassandraConfig {

@Bean
public CqlSessionFactoryBean session() {

CqlSessionFactoryBean session = new CqlSessionFactoryBean();
session.setContactPoints("localhost");
session.setKeyspaceName("mykeyspace");

return session;
}

@Bean
public SessionFactoryFactoryBean sessionFactory(CqlSession session, CassandraConverter converter) {

SessionFactoryFactoryBean sessionFactory = new SessionFactoryFactoryBean();
sessionFactory.setSession(session);
sessionFactory.setConverter(converter);
sessionFactory.setSchemaAction(SchemaAction.NONE);

return sessionFactory;
}

@Bean
public CassandraMappingContext mappingContext() {
return new CassandraMappingContext();
}

@Bean
public CassandraConverter converter(CqlSession cqlSession, CassandraMappingContext mappingContext) {

MappingCassandraConverter cassandraConverter = new MappingCassandraConverter(mappingContext);
cassandraConverter.setUserTypeResolver(new SimpleUserTypeResolver(cqlSession));

return cassandraConverter;
}

@Bean
public CassandraOperations cassandraTemplate(SessionFactory sessionFactory, CassandraConverter converter) {
return new CassandraTemplate(sessionFactory, converter);
}
}

创建注册 Spring Data for Apache Cassandra 组件的配置类可能是一项繁重的工作,因此 Spring Data for Apache Cassandra 自带一个预构建的配置支持类。继承 AbstractCassandraConfiguration 的类会注册供 Spring Data for Apache Cassandra 使用的 bean。AbstractCassandraConfiguration 让您可以提供各种配置选项,例如初始实体、默认查询选项、连接池选项、套接字选项等等。如果提供了初始实体,AbstractCassandraConfiguration 还支持基于初始实体进行模式生成。继承 AbstractCassandraConfiguration 至少需要您通过实现 getKeyspaceName 方法来提供键空间名。以下示例展示了如何使用 AbstractCassandraConfiguration 注册 bean:

示例 4. 使用 AbstractCassandraConfiguration 注册 Spring Data for Apache Cassandra bean

@Configuration
public class CassandraConfiguration extends AbstractCassandraConfiguration {

/*
* Provide a contact point to the configuration.
*/
@Override
public String getContactPoints() {
return "localhost";
}

/*
* Provide a keyspace name to the configuration.
*/
@Override
public String getKeyspaceName() {
return "mykeyspace";
}
}

Abstract…Configuration 类会装配您的应用使用 Cassandra 所需的全部 bean。该配置假定只有一个 CqlSession,并通过 SessionFactory 将其装配到相关组件(如 CqlTemplate)中。如果您想自定义 CqlSession 的创建,可以提供一个 SessionBuilderConfigurer 函数来自定义 CqlSessionBuilder。这在需要为 Astra 提供 Cloud Secure Connect Bundle 等场景下很有用。

示例 5. 通过 AbstractCassandraConfiguration 连接到 Astra

@Configuration
public class CustomizedCassandraConfiguration extends AbstractCassandraConfiguration {

/*
* Customize the CqlSession through CqlSessionBuilder.
*/
@Override
protected SessionBuilderConfigurer getSessionBuilderConfigurer() {

Path connectBundlePath = …;

return builder -> builder
.withCloudSecureConnectBundle(Path.of(connectBundlePath));
}

/*
* Provide a keyspace name to the configuration.
*/
@Override
public String getKeyspaceName() {
return "mykeyspace";
}

}

XML 配置​

本节介绍如何用 XML 配置 Spring Data Cassandra。

注意

虽然我们仍支持命名空间配置,但通常建议使用基于 Java 的配置。

外部化连接属性​

要外部化连接属性,您应首先创建一个属性文件,其中包含连接到 Cassandra 所需的信息。contactpoints 和 keyspace 是必填字段。

以下示例展示了我们的属性文件,名为 cassandra.properties:

cassandra.contactpoints=10.1.55.80:9042,10.1.55.81:9042
cassandra.keyspace=showcase

在接下来两个示例中,我们使用 Spring 将这些属性加载到 Spring 上下文中。

使用基于 XML 的元数据注册会话实例​

虽然您可以使用 Spring 传统的 <beans/> XML 命名空间向容器注册一个 com.datastax.oss.driver.api.core.CqlSession 实例,但 XML 可能相当冗长,因为它是通用的。对于配置常用对象(如 CqlSession 实例),XML 命名空间是更好的选择。cassandra 命名空间让您可以创建 CqlSession 实例。

以下示例展示了如何配置 cassandra 命名空间:

示例 6. 使用 cassandra 命名空间配置 Cassandra 的 XML schema

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cassandra="http://www.springframework.org/schema/data/cassandra"
xsi:schemaLocation="
http://www.springframework.org/schema/data/cassandra
https://www.springframework.org/schema/data/cassandra/spring-cassandra.xsd
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- Default bean name is 'cassandraSession' -->
<cassandra:session contact-points="localhost" port="9042">
<cassandra:keyspace action="CREATE_DROP" name="mykeyspace" />
</cassandra:session>

<cassandra:session-factory>
<cassandra:script
location="classpath:/org/springframework/data/cassandra/config/schema.cql"/>
</cassandra:session-factory>
</beans>

下面展示了用于更高级 Cassandra 配置的 XML 配置元素。这些元素都使用默认 bean 名,以保持配置代码简洁可读。

前面的示例展示了配置 Spring 连接到 Cassandra 有多么简单,但还有许多其他选项。基本上,DataStax Java Driver 提供的任何选项在 Spring Data for Apache Cassandra 配置中也都可用。这包括但不限于认证、负载均衡策略、重试策略和连接池选项。Spring Data for Apache Cassandra 的所有方法名和 XML 元素都(完全或尽可能)与驱动上的配置选项同名,因此映射任何现有的驱动配置都应该很直接。以下示例展示了如何使用 XML 配置 Spring Data 组件

示例 7. 使用 XML 配置 Spring Data 组件

<!-- Loads the properties into the Spring Context and uses them to fill
in placeholders in the bean definitions -->
<context:property-placeholder location="classpath:cassandra.properties" />

<!-- REQUIRED: The Cassandra Session -->
<cassandra:session contact-points="${cassandra.contactpoints}" keyspace-name="${cassandra.keyspace}" />

<!-- REQUIRED: The default Cassandra mapping context used by `CassandraConverter` -->
<cassandra:mapping>
<cassandra:user-type-resolver keyspace-name="${cassandra.keyspace}" />
</cassandra:mapping>

<!-- REQUIRED: The default Cassandra converter used by `CassandraTemplate` -->
<cassandra:converter />

<!-- REQUIRED: The Cassandra template is the foundation of all Spring
Data Cassandra -->
<cassandra:template id="cassandraTemplate" />

<!-- OPTIONAL: If you use Spring Data for Apache Cassandra repositories, add
your base packages to scan here -->
<cassandra:repositories base-package="org.spring.cassandra.example.repo" />