【问题标题】:Run Query against multiple namespaces with Spring Data Cassandra使用 Spring Data Cassandra 对多个命名空间运行查询
【发布时间】:2018-02-06 13:24:53
【问题描述】:

有没有什么方法可以使用 Spring Data 对 Cassandra 中的所有键空间执行查询?

【问题讨论】:

  • 您能详细分享一下您想要实现的目标吗?
  • 主要思想是我希望有某种机制使我能够仅在我选择的某些键空间上并通过阅读文档进行查询(选择、插入、更新、删除)我似乎无法做到这一点,所以这就是我在这里寻求帮助的原因。 Atm 我将org.springframework.data.cassandra.repository.CassandraRepositoryorg.springframework.stereotype.Repository 一起使用,但这种机制无法让我达到我想要的灵活性水平。
  • 我应该使用多个会话(只有在这里我可以在单个会话上设置键空间)并在我的 Java 代码中管理它?对于像 Cassandra 这样具有很大灵活性的数据库来说,这样的方法似乎非常麻烦。因此,给定查询 A 和一组键空间(K1、K2、K3、K4、K5 等),我希望查询 A 仅在 K1 和 K4 上执行。
  • 我可以通过使用来自 Sping Data 的 API 以某种方式实现这一点吗?

标签: cassandra spring-data spring-data-cassandra


【解决方案1】:

这个答案分为两部分:

  1. 使用 Spring Data Cassandra 1.x 时,您需要为要使用的每个键空间设置单独的 CassandraTemplate 实例。
  2. 在 Spring Data Cassandra 2.x 中,我们引入了SessionFactory 接口来控制使用哪个Session。我们附带routing SessionFactory support,因此您可以提供多个会话和一个鉴别器(通常是基于ThreadLocal 的东西)来选择合适的Session

2.0 的一些示例代码如下所示:

class MyRoutingSessionFactory extends AbstractRoutingSessionFactory {

    ThreadLocal<String> lookupKey = ThreadLocal.withInitial(() -> "default-session");

    void setLookupKey(String lookupKey) {
        this.lookupKey.set(lookupKey);
    }

    @Override
    protected Object determineCurrentLookupKey() {
        return lookupKey.get();
    }
}

class MyConfig extends AbstractCassandraConfiguration {

    @Bean
    @Override
    public SessionFactory sessionFactory() {

        MyRoutingSessionFactory factory = new MyRoutingSessionFactory();
        factory.setDefaultTargetSessionFactory(getRequiredSession());

        MapSessionFactoryLookup lookup = new MapSessionFactoryLookup();

        Session myOtherSession = …;

        lookup.addSessionFactory("default-session", getRequiredSession());          
        lookup.addSessionFactory("my-other-session", myOtherSession);

        factory.setSessionFactoryLookup(lookup);

        return factory;
    }

    // …
}

【讨论】:

  • 我在文档中看到了类似的东西(上周这是我正在做的),但上面的代码仍然让我遇到同样的问题:我需要单独管理即将到来的会话从会话工厂(每个会话都有自己的键空间)以实现 给定查询 A 和一组键空间(K1、K2、K3、K4、K5 等),我希望执行查询 A仅在 K1 和 K4 上
  • 所以上面的代码帮助我让会话 S1 与键空间 K1 和会话 S4 与键空间 K4 并使用两个视图向它们发送相同的查询 Q 以更新 K1 和 K4。会话对象的一个​​非常需要的配置是Session s = new Session(K1, K4); s.execute(Q);,但似乎这是不可能的,至少目前是这样。
  • 不可能通过单个 execute(…)/insert(…) 调用在多个键空间上同时/串行运行单个查询。每个查询都会产生一个自己的结果(形式为 aResultSet/Exception),但这些方法只返回一个响应。
猜你喜欢
  • 2021-09-05
  • 2020-05-31
  • 2021-03-28
  • 2020-03-08
  • 2019-04-18
  • 2014-11-04
  • 2016-01-31
  • 2018-10-31
  • 2016-06-03
相关资源
最近更新 更多