spring-data-cassandra 设置一致性级别
spring-data-cassandra set consistency level
我正在使用 spring-data-cassandra (1.3.1.RELEASE) 连接到 cassandra 数据库。有没有办法改变 spring-data-cassandra 中的一致性级别。
默认情况下它是级别 1 (What is the default consistency level in spring-data-cassandra?)。但如何改变呢?
谢谢!
这些是现在定义的一致性级别:
任意一个,
二 ,
三 ,
法定人数,
全部 ,
LOCAL_QUORUM,
EACH_QUORUM,
串口,
LOCAL_SERIAL ,
LOCAL_ONE .
如果您正在谈论使用除这些以外的其他方法,我认为现在没有可插入的解决方案,您可以在其中定义将参与断言所需一致性的节点数。
如果你想使用上面定义的任何一致性,
一个例子是:
Select s = QueryBuilder.select().from("employee");
s.where(QueryBuilder.eq("id", "234"));
s.setConsistencyLevel(ConsistencyLevel.QUORUM) ;
使用 spring-data-cassandra 的 CrudRepository 接口时无法设置自定义一致性级别。有一个未解决的问题 https://jira.spring.io/browse/DATACASS-14。原因是实现接口方法的 SimpleCassandraRepository 在没有 WriteOptions 参数的情况下调用 CassandraOperations 方法。
我的解决方案:我写了一个自定义的crudrepository实现,在这里我可以自己设置一致性级别。
一种可能是在 application.properties 文件中设置它:
spring.data.cassandra.consistency-级别=LOCAL_QUORUM
从 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)
您现在可以通过在 application.properties 文件中设置以下属性来在 spring 引导中设置此级别。
spring.data.cassandra.consistency-level=quorum
spring.data.cassandra.serial-consistency-level=quorum
文档说您可以将其设置为注释 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);
}
卡桑德拉模板:
cassandraTemplate.insert(myEntity, new WriteOptions().builder()
.consistencyLevel(ConsistencyLevel.QUORUM).build())
我不知道你说的 "If you are not using boot and want to set this globally, give this a shot" 是什么意思
我使用了 spring 启动并且这有效`
@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`
我正在使用 spring-data-cassandra (1.3.1.RELEASE) 连接到 cassandra 数据库。有没有办法改变 spring-data-cassandra 中的一致性级别。 默认情况下它是级别 1 (What is the default consistency level in spring-data-cassandra?)。但如何改变呢?
谢谢!
这些是现在定义的一致性级别:
任意一个,
二 ,
三 ,
法定人数,
全部 ,
LOCAL_QUORUM,
EACH_QUORUM,
串口,
LOCAL_SERIAL ,
LOCAL_ONE .
如果您正在谈论使用除这些以外的其他方法,我认为现在没有可插入的解决方案,您可以在其中定义将参与断言所需一致性的节点数。
如果你想使用上面定义的任何一致性,
一个例子是:
Select s = QueryBuilder.select().from("employee");
s.where(QueryBuilder.eq("id", "234"));
s.setConsistencyLevel(ConsistencyLevel.QUORUM) ;
使用 spring-data-cassandra 的 CrudRepository 接口时无法设置自定义一致性级别。有一个未解决的问题 https://jira.spring.io/browse/DATACASS-14。原因是实现接口方法的 SimpleCassandraRepository 在没有 WriteOptions 参数的情况下调用 CassandraOperations 方法。
我的解决方案:我写了一个自定义的crudrepository实现,在这里我可以自己设置一致性级别。
一种可能是在 application.properties 文件中设置它: spring.data.cassandra.consistency-级别=LOCAL_QUORUM
从 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)
您现在可以通过在 application.properties 文件中设置以下属性来在 spring 引导中设置此级别。
spring.data.cassandra.consistency-level=quorum
spring.data.cassandra.serial-consistency-level=quorum
文档说您可以将其设置为注释 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);
}
卡桑德拉模板:
cassandraTemplate.insert(myEntity, new WriteOptions().builder()
.consistencyLevel(ConsistencyLevel.QUORUM).build())
我不知道你说的 "If you are not using boot and want to set this globally, give this a shot" 是什么意思 我使用了 spring 启动并且这有效`
@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`