2017-08-29 1 views
1

Existe-t-il un moyen d'utiliser Spring Data pour exécuter une requête sur tous les espaces de touches de Cassandra?Exécuter une requête sur plusieurs espaces de noms avec des données de ressort Cassandra

+0

Pourriez-vous en détail ce que vous souhaitez atteindre? – mp911de

+0

L'idée principale est que je veux avoir une sorte de mécanisme qui me permet de faire une requête (sélectionner, insérer, mettre à jour, supprimer) seulement sur certains espaces de touches que je choisis et en lisant la documentation je ne peux pas être capable de le faire, c'est pourquoi je demande de l'aide ici. Atm utilise le 'org.springframework.data.cassandra.repository.CassandraRepository' avec' org.springframework.stereotype.Repository' et ce mécanisme ne me permet pas d'atteindre le niveau de flexibilité que je veux. – Carolik

+0

Dois-je aller avec plusieurs sessions (seulement ici je peux définir l'espace de clés sur une seule session) et gérer cela dans mon code Java? Une approche comme celle-ci semble très lourde pour un db comme Cassandra qui promet beaucoup de flexibilité. Donc, compte tenu de la requête A et d'un ensemble d'espaces de touches (K1, K2, K3, K4, K5, etc.), je voudrais que la requête A soit exécutée uniquement sur K1 et K4. – Carolik

Répondre

2

Il y a deux parties à cette réponse:

  1. Lors de l'utilisation de données Cassandra 1.x Spring, vous êtes besoin de configurer CassandraTemplate individuels pour chaque cas Keyspace que vous souhaitez utiliser. Avec Spring Data Cassandra 2.x, nous avons introduit l'interface SessionFactory pour contrôler les Session à utiliser. Nous expédions avec routing SessionFactory support de sorte que vous pouvez fournir plusieurs sessions et un discriminateur (généralement quelque chose ThreadLocal -based) pour sélectionner le Session approprié.

quelques exemples de code pour 2.0 ressemblerait à ceci:

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; 
    } 

    // … 
} 
+0

J'ai vu quelque chose de similaire dans la documentation (la semaine dernière c'est ce que je faisais), mais le code ci-dessus me pose toujours le même problème: je dois gérer les sessions séparément de la fabrique de sessions (chaque session avec son propre espace de clé) pour obtenir ** la requête donnée A et un ensemble d'espaces de touches (K1, K2, K3, K4, K5, etc.), je voudrais que la requête A soit exécutée uniquement sur K1 et K4 ** – Carolik

+0

donc le code ci-dessus m'aide à avoir la session S1 avec l'espace de clés K1 et la session S4 avec l'espace de touches K4 et utiliser les deux sessions pour leur envoyer la même requête Q afin de mettre à jour K1 et K4. Une configuration très nécessaire de l'objet session serait: Session s = nouvelle session (K1, K4); s.execute (Q); mais il semble que ce ne soit pas possible, du moins pour l'instant. – Carolik

+1

Il n'est pas possible d'exécuter une seule requête simultanément/en série sur plusieurs espaces de clés avec un seul appel 'execute (...)'/'insert (...)'. Chaque requête produit un résultat propre (sous la forme d'un 'ResetSet' /' Exception') mais les méthodes ne retournent qu'une seule réponse. – mp911de