对于最新的稳定版本,请使用 Spring Data Cassandra 4.4.0! |
使用 Spring 连接到 Cassandra
使用基于 Java 的元数据注册会话实例
以下示例显示如何使用基于 Java 的 bean 元数据注册 :com.datastax.oss.driver.api.core.CqlSession
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();
}
}
此方法允许您使用您可能已经知道的标准 API。com.datastax.oss.driver.api.core.CqlSession
另一种方法是使用 Spring 的 .
与直接实例化实例相比,该方法具有额外的优势,即还为容器提供了一个实现,该实现将 Cassandra 异常转换为 Spring 的可移植层次结构中的异常。
这种层次结构和的使用在 Spring 的 DAO 支持功能中进行了描述。com.datastax.oss.driver.api.core.CqlSession
CqlSessionFactoryBean
com.datastax.oss.driver.api.core.CqlSession
FactoryBean
ExceptionTranslator
DataAccessException
@Repository
以下示例显示了基于 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 附带了一个预构建的配置支持类。
从 Spring Data for Apache Cassandra 使用的注册 bean 扩展而来的类。 允许您提供各种配置选项,如初始实体、默认查询选项、池化选项、套接字选项等等。 还支持基于初始实体(如果提供了)生成架构。
extends from 要求您至少通过实现该方法来提供密钥空间名称。
以下示例显示如何使用注册 bean:AbstractCassandraConfiguration
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。
该配置假定一个 single 并将其连接到相关组件中,例如 .
如果要自定义 的创建,则可以提供自定义 的函数。
这对于提供例如 Astra 的 Cloud Connection Bundle 非常有用。CqlSession
SessionFactory
CqlTemplate
CqlSession
SessionBuilderConfigurer
CqlSessionBuilder
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 的元数据注册 Session 实例
虽然你可以使用 Spring 的传统 XML 名称空间向容器注册一个实例,但 XML 可能非常冗长,因为它是通用的。
XML 命名空间是配置常用对象(如实例)的更好替代方法。
命名空间允许您创建实例。<beans/>
com.datastax.oss.driver.api.core.CqlSession
CqlSession
cassandra
CqlSession
以下示例显示如何配置命名空间:cassandra
cassandra
<?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" />