spring-data-cassandra 设置一致性级别

问题描述 投票:0回答:8

我正在使用 spring-data-cassandra (1.3.1.RELEASE) 连接到 cassandra 数据库。有没有办法改变 spring-data-cassandra 中的一致性级别。 默认情况下,它是级别 1(spring-data-cassandra 中的默认一致性级别是什么?)。但如何改变呢?

谢谢!

java spring-data-cassandra
8个回答
6
投票

您现在可以通过在 application.properties 文件中设置以下属性来在 Spring Boot 中设置此级别。

spring.data.cassandra.consistency-level=quorum
spring.data.cassandra.serial-consistency-level=quorum

4
投票

文档说你可以将其设置为注释https://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#cassandra.repositories.queries.options.

IMO,控制每个请求的一致性级别总是比每个应用程序更好。 存储库:

public interface PersonRepository extends CrudRepository<Person, String> {

    @Consistency(ConsistencyLevel.LOCAL_ONE)
    List<Person> findByLastname(String lastname);

    List<Person> findByFirstname(String firstname, QueryOptions options);
}

Cassandra 模板:

cassandraTemplate.insert(myEntity, new WriteOptions().builder()
                    .consistencyLevel(ConsistencyLevel.QUORUM).build())

3
投票

使用 spring-data-cassandra 的 CrudRepository 接口时无法设置自定义一致性级别。有一个未解决的问题https://jira.spring.io/browse/DATACASS-14。原因是实现该接口方法的 SimpleCassandraRepository 调用 CassandraOperations 方法时不带 WriteOptions 参数。

我的解决方案:我编写了一个自定义的crudrepository实现,在这里我可以自己设置一致性级别。


2
投票

恢复这个旧线程,以防其他人在这里遇到相同/类似的问题。

对于

spring-data-cassandra:3.4.0
使用
DataStax
我已经使用以下方法使其工作:

@Configuration 
public class CassandraConfig extends AbstractCassandraConfiguration {

    @Override
    public CassandraTemplate cassandraTemplate(Session session) {
        CassandraTemplate template = new CassandraTemplate(session);
        CqlTemplate cqlTemplate = (CqlTemplate) template.getCqlOperations();
        cqlTemplate.setConsistencyLevel(DefaultConsistencyLevel.valueOf("LOCAL_QUORUM"));
        cqlTemplate.setSerialConsistencyLevel(DefaultConsistencyLevel.valueOf("LOCAL_SERIAL"));
        return template;
    } }

我希望这有帮助。


1
投票

这些是现在定义的一致性级别:
任何一个, 二 , 三 , 法定人数, 全部 , 本地法定人数, 每个法定人数, 串行, 本地序列号, LOCAL_ONE .
如果您正在谈论使用除这些之外的其他内容,我认为现在没有可插入的解决方案,您可以在其中定义将参与断言所需一致性的节点数量。
如果您想使用任何上述定义的一致性,
一个例子是:

        Select s = QueryBuilder.select().from("employee");
        s.where(QueryBuilder.eq("id", "234"));
        s.setConsistencyLevel(ConsistencyLevel.QUORUM) ;

1
投票

我不确定“如果您不使用启动并且想要全局设置它,请尝试一下”是什么意思 我使用了 Spring Boot,这有效`

@Configuration     
public class CassandraConfig extends AbstractCassandraConfiguration {




@Override
public QueryOptions getQueryOptions() {
    QueryOptions queryOptions = new QueryOptions();
    queryOptions.setConsistencyLevel(ConsistencyLevel.TWO);
    return queryOptions;
}

@Override
protected String getKeyspaceName() {
    return keyspaceName;
}

@Override
public CassandraCqlClusterFactoryBean cluster() {
    CassandraCqlClusterFactoryBean cluster = super.cluster();
    cluster.setContactPoints(contactPoints);
    cluster.setPort(port);
    cluster.setUsername(username);
    cluster.setPassword(password);
    return cluster;
}
//Also added @Import to Main class

@Import(CassandraConfig.class)
@EnableJpaRepositories(basePackageClasses = Vexxxxxxy.class)
@EnableCassandraRepositories(basePackageClasses = Txxxxxry.class)
@EntityScan(basePackageClasses = { Entity.class, Vxxxxity.class })
@SpringBootApplication(scanBasePackages = "com.xx.xxx")
public class DrixxxxxxxxMain`

0
投票

一种可能是在 application.properties 文件中设置它: spring.data.cassandra.consistency-level=LOCAL_QUORUM


0
投票

spring-data-cassandra
release 1.5 开始,一致性级别已经可以配置(请参阅
org.springframework.cassandra.core.QueryOptions#setConsistencyLevel(org.springframework.cassandra.core.ConsistencyLevel))

它可以被指定为

QueryOptions
的一部分,或者通过
org.springframework.cassandra.core.CqlOperations#execute(java.lang.String, org.springframework.cassandra.core.QueryOptions)
进行单个查询,或者通过
org.springframework.cassandra.core.CqlTemplate#addQueryOptions

进行所有类型的查询

还可以通过

WriteOptions
设置一致性级别,然后将它们传递给
org.springframework.data.cassandra.core.CassandraOperations#insert(T, org.springframework.cassandra.core.WriteOptions)

© www.soinside.com 2019 - 2024. All rights reserved.