Cassandra Spring-数据多租户

Cassandra Spring-data Multitenancy

所以,我准备将多租户(每个租户一个键空间)方面与 spring-boot-starter-data-cassandra-reactive 集成,我试图找到一种解决方案来访问正确的键空间,我发现了这种使用查询构建器的方法:

Select select = QueryBuilder.select().from(tenantId,"counter");
select.where(QueryBuilder.eq("id", 1));
Mono<Counter> flux = reactiveCassandraOperations.selectOne(select.toString(), Counter.class);

我发现它在开发时间方面成本很高,尤其是当我们有插入请求时.. 根据您的经验,有一个实用的解决方案,我可以使用 ReactiveCassandraRepository 方法(保存、更新、findById ..)插入键空间名称

能否支持一下,先谢谢了。

不是 Cassandra 或 Spring 专家,但我被告知您应该使用 ReactiveCqlTemplate(或 ReactiveCqlOperations)而不是 ReactiveCassandraTemplate(或 ReactiveCassandraOperations)。请参阅此 link https://github.com/spring-projects/spring-data-cassandra/issues/1218 并关注此页面中的 link。

从link,您可以从 CassandraTemplate 中获取 CqlOperations,如下所示

private final ReactiveCqlOperations cqlOps;
private final YourRepository repository;

@Autowired
public YourService(YourRepository repository, ReactiveCassandraTemplate reactiveCassandraTemplate){
    this.repository = repository;
    this.cqlOps = reactiveCassandraTemplate.getReactiveCqlOperations();
}

然后在您的存储库中

public interface YourRepository extends ReactiveCassandraRepository<YourData, Long> {

default Flux<YourData> getCQL(ReactiveCqlOperations cqlOps, YourData yourData) {
    return cqlOps.query("SELECT * FROM genericdatadb.YourData WHERE val0 = ? AND val1 = ?;",
            YourRepository.YourDataMapper.INSTANCE,
            yourData.getVal0(),
            yourData.getVal1());
}

在查询中,genericdatadb 是键空间,YourData 是 table。从这里,您可以添加一个“?”其中 genericdatadb 是或使用 String.format 语句创建查询字符串。也许有 Cassandra 专家有更好的解决方案?