10
votes

Support de Keyspace multiple pour les référentiels Spring-Data-Cassandra?

Data Data Cassandra prend en charge plusieurs référentiels de Keyspace dans le même contexte d'application? Je configure la configuration de données de printemps Cassandra à l'aide de la classe Javaconfig suivante

@Configuration
@EnableCassandraRepositories(basePackages = "com.blah.secondrepository")
public class SecondCassandraConfig extends AbstractCassandraConfiguration {

@Override
public String getKeyspaceName() {
    return "keyspace2";
}


1 commentaires

Je renvoie ceci à l'ingénieur qui a manipulé la majeure partie du référentiel codant pour vous obtenir une réponse .. Asseyez-vous bien.


6 Réponses :


2
votes

Essayez de nommer explicitement votre CassandraTemplate haricots pour chaque clavier et en utilisant ces noms dans le @enablecassandRarePositories Annotation CassandraTemplplateef attribut (voir lignes avec / * Modifié * / pour les modifications).

Dans votre première configuration: xxx

... et dans votre deuxième configuration: XXX

Je pense que cela pourrait faire le tour. S'il vous plaît poster si ce n'est pas le cas.


2 commentaires

Je vais essayer cela et revenir.


Pas capable de trouver des haricots du référentiel.



0
votes

Il semble qu'il soit recommandé d'utiliser des noms de frappe entièrement qualifiés dans des requêtes gérées par une session, car la session n'est pas très légère.
S'il vous plaît voir référence ici


1 commentaires

Bonne trouvaille. Il convient de noter que votre exemple lié dispose de 100 claviers, alors que celui-ci a 2. deux sessions non si légères pourraient être acceptables où 100 causeront des problèmes.



0
votes

J'ai essayé cette approche. Cependant, j'ai rencontré des exceptions tout en essayant d'accéder à la famille de colonnes 2. Les opérations sur la famille de colonnes 1 semblent être bien.

Je devine parce que le cassandrasesssessorybeanbeanbeanbean est un singleton. Et cette cause ColummyFamily columnyFamily non configuré2

Voici quelques journaux supplémentaires pour fournir le contexte

débogage org.springframework.beans.Factory.support.defaultListableBeanFactory - instance mise en cache de Singleton 'EntityManagerFactory' Déboguer org.springframework.beans.Factory.support.defaultListableBeanFactory - instance mise en cache de Singleton 'Session' Déboguer org.springframework.beans.Factory.support.defaultListableBeanFactory - instance mise en cache de renvoi de Singleton Bean 'Cluster'

org.springframework.cassandra.support.exception.CassandrainValidQueryException: ColumsFamily de colonne non configuréggroup; Exception imbriquée est com.datastax.driver.core.Exception.InvalidQueryException: ColummyFamily columnyFamily2 non configuré2 à org.springframework.cassandra.support.cassandraExceptionTtranslator.TranslateExceptionIflossible (CassandraExceptionTtranslator.java:116) à org.springframework.cassandra.config.cassandracqlsesssessorybeanBean.TransLateSypreSompossible (CassandracQlsessssibleBean.java:74)


0 commentaires

0
votes

hmm. Ne peut pas commenter la réponse de Matthew-Adams. Mais cela réutilisera l'objet de session comme une abstractcassandraconfiguration est annoté avec @Bean sur tous les getters pertinents.

Dans une configuration similaire, j'avais initialement travailler avec écraser tous les getters et leur donner spécifiquement des noms de haricots différents. Mais à cause du printemps prétendant toujours avoir besoin de haricots avec les noms. J'ai maintenant dû faire une copie d'abstractcassandraconfiguration sans annotations que je peux hériter.

Assurez-vous d'exposer la CassandraTemplate afin que vous puissiez vous reporter à partir de @enablecassandRarePositories si vous utilisez celles-ci.

J'ai également une mise en œuvre distraite de l'abstractclusterconfiguration pour exposer un CassandracQLClusteroryBean commun afin que les connexions sous-jacentes soient réutilisées.

EDIT: Je suppose que, selon le fil de courriel lié par BcLarance, il faut vraiment tenter de réutiliser l'objet de session. Semble la manière dont les données de printemps, Cassandra n'est pas vraiment configurée pour cela si


1 commentaires

Un problème avec mon approche est que l'objet de la session est créé dans un après-dépôt sur le CassandracqlSessoryBean. Donc, il doit être un haricot au printemps pour que cela se produise



5
votes

Application d'application de travail: http://valchkou.com/spring-boot-cassandra.html#multikeyspacepace

L'idée dont vous avez besoin de haricots par défaut remplaçants: SéanceFactory et Modèle P>

échantillon: p>

1) Application.yml P>

package com.sample.repo.test1;

@Repository
public interface RepositoryForTest1 extends CassandraRepository<MyEntity> {
// ....
}


package com.sample.repo.test2;

@Repository
public interface RepositoryForTest2 extends CassandraRepository<MyEntity> {
// ....
}


1 commentaires

Pas capable de trouver un référentiel



0
votes

Dans mon cas, j'avais une application de démarrage de printemps où la majorité des dépôts étaient dans un clavier, et deux seulement étaient dans une seconde. J'ai conservé la configuration de démarrage de ressort par défaut pour le premier espace de frappe et configuré manuellement le second clavier à l'aide du même démarrage de ressort d'approche de configuration utilise pour son autoconfiguration.

@Configuration
public class SecondKeyspaceCassandraConfig {
    public static final String KEYSPACE_NAME = "second_keyspace";

    /**
     * @see org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration#cassandraSession(CassandraConverter)
     */
    @Bean(autowireCandidate = false)
    public CassandraSessionFactoryBean secondKeyspaceCassandraSession(
            Cluster cluster, Environment environment, CassandraConverter converter) {
        CassandraSessionFactoryBean session = new CassandraSessionFactoryBean();
        session.setCluster(cluster);
        session.setConverter(converter);
        session.setKeyspaceName(KEYSPACE_NAME);
        Binder binder = Binder.get(environment);
        binder.bind("spring.data.cassandra.schema-action", SchemaAction.class)
                .ifBound(session::setSchemaAction);
        return session;
    }

    /**
     * @see org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration#cassandraTemplate(com.datastax.driver.core.Session, CassandraConverter)
     */
    @Bean(autowireCandidate = false)
    public CassandraTemplate secondKeyspaceCassandraTemplate(
            Cluster cluster, Environment environment, CassandraConverter converter) {
        return new CassandraTemplate(secondKeyspaceCassandraSession(cluster, environment, converter)
                .getObject(), converter);
    }

    @Bean
    public SecondKeyspaceTableARepository cdwEventRepository(
            Cluster cluster, Environment environment, CassandraConverter converter) {
        return createRepository(CDWEventRepository.class, 
                secondKeyspaceCassandraTemplate(cluster, environment, converter));
    }

    @Bean
    public SecondKeyspaceTableBTypeRepository dailyCapacityRepository(
            Cluster cluster, Environment environment, CassandraConverter converter) {
        return createRepository(DailyCapacityRepository.class,
                secondKeyspaceCassandraTemplate(cluster, environment, converter));
    }

    private <T> T createRepository(Class<T> repositoryInterface, CassandraTemplate operations) {
        return new CassandraRepositoryFactory(operations).getRepository(repositoryInterface);
    }
}


0 commentaires