10

Spring Data Cassandra は、同じアプリケーションコンテキストで複数のキースペースリポジトリをサポートしていますか? 次のJavaConfigクラスを使用してcassandra springデータ構成をセットアップしています

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

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

リポジトリ クラスを別のパッケージに移動した後、2 つ目の構成クラスを作成してみました。

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

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

ただし、その場合、エンティティの構成された列ファミリがキースペースに見つからないため、リポジトリが失敗した場合の最初のセット。おそらく2番目のキースペースで列ファミリーを探していると思います。

spring-data-cassandra は複数のキースペース リポジトリをサポートしていますか? 複数のキースペースの参照を見つけた唯一の場所はhereでした。しかし、これがリポジトリで実行できるかどうかは説明されていませんか?

4

6 に答える 6

5

動作するアプリのサンプル: http://valchkou.com/spring-boot-cassandra.html#multikeyspace

デフォルトの Bean をオーバーライドする必要があるアイデア: sessionfactory と template

サンプル:

1) アプリケーション.yml

 spring:
  data:
    cassandra:
      test1:
        keyspace-name: test1_keyspace
        contact-points: localhost
      test2:
        keyspace-name: test2_keyspace
        contact-points: localhost

2) ベース構成クラス

public abstract class CassandraBaseConfig extends AbstractCassandraConfiguration{
    protected String contactPoints;
    protected String keyspaceName;

    public String getContactPoints() {
        return contactPoints;
    }
    public void setContactPoints(String contactPoints) {
        this.contactPoints = contactPoints;
    }

    public void setKeyspaceName(String keyspaceName) {
        this.keyspaceName = keyspaceName;
    }
    @Override
    protected String getKeyspaceName() {
        return keyspaceName;
    }
}

3) test1 の設定実装

package com.sample.repo.test1;

@Configuration
@ConfigurationProperties("spring.data.cassandra.test1")
@EnableCassandraRepositories(
        basePackages = "com.sample.repo.test1",
        cassandraTemplateRef = "test1Template"
)
public class Test1Config extends CassandraBaseConfig {

    @Override
    @Primary
    @Bean(name = "test1Template")
    public CassandraAdminOperations cassandraTemplate() throws Exception {
        return new CassandraAdminTemplate(session().getObject(), cassandraConverter());
    }

    @Override
    @Bean(name = "test1Session")
    public CassandraSessionFactoryBean session() throws Exception {

        CassandraSessionFactoryBean session = new CassandraSessionFactoryBean();

        session.setCluster(cluster().getObject());
        session.setConverter(cassandraConverter());
        session.setKeyspaceName(getKeyspaceName());
        session.setSchemaAction(getSchemaAction());
        session.setStartupScripts(getStartupScripts());
        session.setShutdownScripts(getShutdownScripts());

        return session;
    }
}

4) test2 についても同じですが、別のパッケージ パッケージ com.sample.repo.test2 を使用するだけです。

5)各キースペースのレポを専用パッケージに配置します。つまり

package com.sample.repo.test1;

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


package com.sample.repo.test2;

@Repository
public interface RepositoryForTest2 extends CassandraRepository<MyEntity> {
// ....
}
于 2016-07-15T23:15:25.137 に答える
2

CassandraTemplateキースペースごとに Bean に明示的に名前を付け、それらの名前を@EnableCassandraRepositoriesアノテーションのcassandraTemplateRef属性で使用してみてください (/* CHANGED */変更については の行を参照してください)。

最初の構成では:

@Configuration
@EnableCassandraRepositories(basePackages = "com.blah.repository",
    /* CHANGED */ cassandraTemplateRef = "template1")
public class CassandraConfig extends AbstractCassandraConfiguration {

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

/* CHANGED */
@Override
@Bean(name = "template1")
public CassandraAdminOperations cassandraTemplate() throws Exception {
    return new CassandraAdminTemplate(session().getObject(), cassandraConverter());
}

...そして2番目の構成では:

@Configuration
@EnableCassandraRepositories(basePackages = "com.blah.secondrepository",
    /* CHANGED */ cassandraTemplateRef = "template2")
public class SecondCassandraConfig extends AbstractCassandraConfiguration {

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

/* CHANGED */
@Override
@Bean(name = "template2")
public CassandraAdminOperations cassandraTemplate() throws Exception {
    return new CassandraAdminTemplate(session().getObject(), cassandraConverter());
}

それがうまくいくかもしれないと思います。そうでない場合は、投稿してください。

于 2014-09-19T13:50:06.983 に答える
0

セッションはあまり軽量ではないため、1 つのセッションで管理されるクエリでは完全修飾キースペース名を使用することをお勧めします。 こちら
を参考にしてください

于 2015-04-04T00:26:17.927 に答える
0

うーん。matthew-adams による回答についてコメントすることはできません。ただし、関連するすべてのゲッターで AbstractCassandraConfiguration に @Bean アノテーションが付けられているため、セッション オブジェクトが再利用されます。

同様の設定で、最初はすべてのゲッターを上書きし、具体的には異なる Bean 名を付けて動作させました。しかし、Spring はまだ名前付きの Bean が必要だと主張しているためです。継承できる注釈なしで AbstractCassandraConfiguration のコピーを作成する必要がありました。

@EnableCassandraRepositories を使用する場合は、CassandraTemplate を公開して、それらを参照できるようにしてください。

また、共通の CassandraCqlClusterFactoryBean を公開するための AbstractClusterConfiguration の個別の実装も用意されているため、基になる接続が再利用されます。

編集: bclarance によってリンクされた電子メール スレッドによると、実際に Session オブジェクトを再利用する必要があると思います。ただし、Spring Data Cassandra は実際にはそのように設定されていないようです

于 2015-08-13T13:57:11.627 に答える
0

私はこのアプローチを試みました。ただし、列ファミリー 2 にアクセスしようとしたときに例外が発生しました。列ファミリー 1 の操作は問題ないようです。

基になる CassandraSessionFactoryBean Bean がシングルトンであるため、私は推測しています。そして、これにより未構成の columnfamily columnfamily2 が発生します

コンテキストを提供するためのその他のログを次に示します

DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - シングルトン Bean 'entityManagerFactory' のキャッシュされたインスタンスを返す DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - シングルトン Bean 'session' のキャッシュされたインスタンスを返す DEBUG org.springframework.beans .factory.support.DefaultListableBeanFactory - シングルトン Bean 'cluster' のキャッシュされたインスタンスを返す

org.springframework.cassandra.support.exception.CassandraInvalidQueryException: 構成されていない columnfamily シャードグループ。ネストされた例外は com.datastax.driver.core.exceptions.InvalidQueryException: unconfigured columnfamily columnfamily2 at org.springframework.cassandra.support.CassandraExceptionTranslator.translateExceptionIfPossible(CassandraExceptionTranslator.java:116) at org.springframework.cassandra.config.CassandraCqlSessionFactoryBean.translateExceptionIfPossible( CassandraCqlSessionFactoryBean.java:74)

于 2015-07-12T00:45:23.757 に答える