此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Data Cassandra 4.5.2! |
使用 Spring 连接到 Cassandra
使用基于 Java 的元数据注册会话实例
以下示例显示如何使用基于 Java 的 bean 元数据注册com.datastax.oss.driver.api.core.CqlSession
:
com.datastax.oss.driver.api.core.CqlSession
对象,使用基于 Java 的 bean 元数据@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。
另一种方法是注册com.datastax.oss.driver.api.core.CqlSession
使用 Spring 的CqlSessionFactoryBean
.
与实例化com.datastax.oss.driver.api.core.CqlSession
实例,则FactoryBean
方法的另一个优点是还为容器提供了ExceptionTranslator
将 Cassandra 异常转换为 Spring 可移植DataAccessException
等级制度。
这种层次结构和使用@Repository
在 Spring 的 DAO 支持功能中进行了描述。
以下示例显示了基于 Java 的工厂类用法:
CqlSessionFactoryBean
:@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
,并启用存储库支持。
以下示例显示了如何注册组件以配置对象映射和存储库支持:
@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
注册 Bean 以供 Apache Cassandra 使用的 Spring Data 使用。AbstractCassandraConfiguration
允许您提供各种配置选项,例如初始实体、默认查询选项、池化选项、套接字选项等等。AbstractCassandraConfiguration
还支持基于初始实体(如果提供任何实体)生成架构。
扩展自AbstractCassandraConfiguration
要求您至少通过实现getKeyspaceName
方法。
以下示例显示如何使用AbstractCassandraConfiguration
:
AbstractCassandraConfiguration
@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 的云连接包非常有用。
AbstractCassandraConfiguration
@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 可能非常冗长,因为它是通用的。
XML 命名空间是配置常用对象的更好替代方案,例如CqlSession
实例。
这cassandra
命名空间允许您创建CqlSession
实例。
以下示例显示如何配置cassandra
Namespace:
cassandra
Namespace<?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 驱动程序提供的任何选项也可在 Spring Data for Apache Cassandra 配置中使用。 这包括但不限于身份验证、负载均衡策略、重试策略和池化选项。 所有 Spring Data for Apache Cassandra 方法名称和 XML 元素的命名都与驱动程序上的配置选项完全相同(或尽可能接近),因此映射任何现有驱动程序配置都应该很简单。 以下示例显示如何使用 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" />