Spring Data Cassandra设置一致性级别。

5

好的,看起来目前还没有设置自定义一致性级别的方法:https://jira.spring.io/browse/DATACASS-145 - K.E.
8个回答

6

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

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

1
你知道是哪个版本添加了这个吗? - Arya

3
使用spring-data-cassandra的CrudRepository接口时,无法设置自定义一致性级别。有一个开放问题https://jira.spring.io/browse/DATACASS-14。原因是实现接口方法的SimpleCassandraRepository调用CassandraOperations方法时没有传递WriteOptions参数。 我的解决方案: 我编写了一个自定义的crudrepository实现,在其中可以自行设置一致性级别。

这个问题还存在吗?还是已经解决了?我也想在Spring-Data-Cassandra中设置自定义一致性级别。 - Sushil Mittal

3

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

我认为,每个请求控制一致性级别总是比应用程序控制更好。

存储库:

public interface PersonRepository extends CrudRepository<Person, String> {

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

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

CassandraTemplate:

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

1

我不确定你的意思是什么,当你没有使用 boot 且想要全局设置时,请尝试以下方法。如果你使用的是 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`

1
这些是目前定义的一致性级别:
ANY, ONE, TWO, THREE, QUORUM, ALL, LOCAL_QUORUM, EACH_QUORUM, SERIAL, LOCAL_SERIAL, LOCAL_ONE
如果您想使用除此之外的其他级别,我认为现在还没有可插拔的解决方案,您需要定义参与断言所需一致性的节点数量。
如果您想使用上述定义的任何一致性级别,
一个示例是:
        Select s = QueryBuilder.select().from("employee");
        s.where(QueryBuilder.eq("id", "234"));
        s.setConsistencyLevel(ConsistencyLevel.QUORUM) ;

谢谢 - 也许我的问题没有表达清楚。我想使用定义的级别,但同时也要使用CrudRepository接口。所以当我构建一个扩展CrudRepository接口的自定义存储库并调用例如save(T)方法时,我将设置一致性级别。但看起来没有办法做到这一点(https://jira.spring.io/browse/DATACASS-145)。原因是实现接口方法的SimpleCassandraRepository在调用CassandraOperations方法时没有WriteOptions参数。 - K.E.
好的。如果您能编写您的解决方案并接受它,那么问题就可以被关闭了。 - Chandra kant

1

如果有其他人遇到相同或类似的问题,我希望您能重新启动这个旧的线程。

对于使用DataStaxspring-data-cassandra:3.4.0,我已经成功地使用以下方法:

@Configuration 
public class CassandraConfig extends AbstractCassandraConfiguration {

    @Override
    public CassandraAdminTemplate cassandraTemplate() {
        CassandraAdminTemplate adminTemplate = super.cassandraTemplate();
        CqlTemplate cqlTemplate = (CqlTemplate) adminTemplate.getCqlOperations();
        cqlTemplate.setConsistencyLevel(DefaultConsistencyLevel.valueOf("LOCAL_QUORUM"));
        cqlTemplate.setSerialConsistencyLevel(DefaultConsistencyLevel.valueOf("LOCAL_SERIAL"));
        return adminTemplate;
    } }

我希望这可以帮到你。

0

spring-data-cassandra 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)


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接