2016-05-20 19 views
6

Cassandraを使用して、Springブートアプリケーションを使用して動的にキースペースとテーブルを作成します。私はJavaベースの設定を使用しています。Springデータを使用してキースペース、テーブルを作成してテーブルを動的に生成するCassandra

@Tableでアノテートされているエンティティは、事前に既知の固定フィールドがあるため、アプリケーションの起動前にスキーマを作成する必要があります。

ログインしたユーザーによっては、これらのユーザーのテーブルを動的に作成し、これらのテーブルにエントリを挿入できるようにしたいと考えています。

誰かが、私がこれらの問題を解決するためにどのように正しい方向に向いているかを指し示すことができるいくつかのリソースに私を導くことができます。ありがとうございました!

答えて

9

ので、同じように、あなたの春ブーツアプリケーションにSpring Boot Starter Data Cassandra依存関係を追加することです最も簡単な方法...

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-data-cassandra</artifactId> 
    <version>1.3.5.RELEASE</version> 
</dependency> 

また、これは春データカサンドラdependencyに追加されますあなたの申請。

春データカサンドラを使用すると、使用して、アプリケーションの鍵空間(複数可)を設定することができますCassandraClusterFactoryBean(またはより正確には、サブクラス... CassandraCqlClusterFactoryBeansetKeyspaceCreations(:Set)メソッドを呼び出すことによって。

KeyspaceActionSpecificationクラスはかなり自明です。 KeyspaceActionSpecificationFactoryBeanで作成してSetに追加して、のsetKeyspaceCreations(..)メソッドに渡すこともできます。

アプリケーションのテーブルを生成するには、基本的にSD Cassandra @Table注釈を使用してアプリケーションドメインオブジェクト(エンティティ)に注釈を付け、ドメインオブジェクト/エンティティがアプリケーションのCLASSPATHに存在することを確認する必要があります。

具体的には、アプリケーション@ConfigurationクラスにSD Cassandra AbstractClusterConfigurationクラスを拡張させることができます。そこには、getEntityBasePackages():String[]メソッドがあり、アプリケーションドメインオブジェクト/エンティティクラスが含まれているパッケージの場所を指定することができます。この場合、SD Cassandraは@Tableドメインオブジェクト/エンティティの場合にscanに使用します。正しく識別アプリケーション@Tableドメインオブジェクト/エンティティと

、あなたはCassandraSessionFactoryBean方法、setSchemaAction(:SchemaAction)を使用してCREATEにSDカサンドラSchemaActionを設定します。これは、あなたのCassandraSessionFactoryBeanidentified適切なKeyspaceを適切に提供しながら、スキャン中に見つかったすべてのドメインオブジェクト/エンティティのためのKeyspaceのテーブルを作成します。

アプリケーションが複数のキースペースを作成/使用する場合は、特定のキー空間に属するエンティティに対してentityBasePackages構成プロパティを適切に設定して、各キースペースに対して別々のCassandraSessionFactoryBeanを作成する必要があります。そのKeyspaceで作成されます。今

...ユーザーごとに「追加」のテーブルの

、それはかなり複雑でトリッキーです。

ここでは、Springプロファイルを利用できるかもしれませんが、一般にプロファイルは起動時にのみ適用されます。別のユーザーがすでに実行中のアプリケーションにログインする場合は、実行時にApplicationContextに追加の@Configurationクラスを追加する方法が必要です。

あなた春ブーツアプリケーションがAnnotationConfigApplicationContextへの参照を注入し、アプリケーションにログインしているユーザーに基づいて@Configurationプログラムでregister追加クラスにログインイベントでそれを使用することができます。 ApplicationContext.refresh()register(Class...)通話をフォローする必要があります。

テーブルがすでに存在する状況を適切に処理する必要もあります。

これは現在SD Cassandraではサポートされていませんが、詳細はDATACASS-219を参照してください。

技術的には、実行時にすべてのユーザーにアプリケーションが必要とするすべてのテーブルを作成し、Cassandraのセキュリティ設定を使用してロールごとの個々のユーザーアクセスを制限し、割り当てられたアクセス許可を制限する方が簡単です。

ユーザがアプリケーションにログインしたときに必要に応じて一時的なキースペースやテーブルを作成するだけで、ユーザがログアウトしたときにドロップすることもできます。

ここではさまざまな選択肢がありますが、アーキテクチャ上の決定、トレードオフ、考慮事項にはさらに詳しい点がありますが、技術的な実現可能性があるので注意してください。

これが役に立ちます。

乾杯!

10

次のスプリング構成クラスは、キースペースとテーブルが存在しない場合に作成します。

@Configuration 
public class CassandraConfig extends AbstractCassandraConfiguration { 
    private static final String KEYSPACE = "my_keyspace"; 
    private static final String USERNAME = "cassandra"; 
    private static final String PASSWORD = "cassandra"; 
    private static final String NODES = "127.0.0.1"; // comma seperated nodes 


    @Bean 
    @Override 
    public CassandraCqlClusterFactoryBean cluster() { 
     CassandraCqlClusterFactoryBean bean = new CassandraCqlClusterFactoryBean(); 
     bean.setKeyspaceCreations(getKeyspaceCreations()); 
     bean.setContactPoints(NODES); 
     bean.setUsername(USERNAME); 
     bean.setPassword(PASSWORD); 
     return bean; 
    } 

    @Override 
    public SchemaAction getSchemaAction() { 
     return SchemaAction.CREATE_IF_NOT_EXISTS; 
    } 

    @Override 
    protected String getKeyspaceName() { 
     return KEYSPACE; 
    } 

    @Override 
    public String[] getEntityBasePackages() { 
     return new String[]{"com.panda"}; 
    } 


    protected List<CreateKeyspaceSpecification> getKeyspaceCreations() { 
     List<CreateKeyspaceSpecification> createKeyspaceSpecifications = new ArrayList<>(); 
     createKeyspaceSpecifications.add(getKeySpaceSpecification()); 
     return createKeyspaceSpecifications; 
    } 

    // Below method creates "my_keyspace" if it doesnt exist. 
    private CreateKeyspaceSpecification getKeySpaceSpecification() { 
     CreateKeyspaceSpecification pandaCoopKeyspace = new CreateKeyspaceSpecification(); 
     DataCenterReplication dcr = new DataCenterReplication("dc1", 3L); 
     pandaCoopKeyspace.name(KEYSPACE); 
     pandaCoopKeyspace.ifNotExists(true).createKeyspace().withNetworkReplication(dcr); 
     return pandaCoopKeyspace; 
    } 

} 
+0

を指定アプリケーションの起動時にキースペースとテーブルを作成します。私が紛失しているものは他にありますか?私を案内してください。 – Milesh

0

カサンドラ構成は、それが存在しない場合に鍵空間を作成しても、起動スクリプトを実行します、私はこのコードを踏襲しているが、それでも、私はすることができません

@Configuration 
@PropertySource(value = {"classpath:cassandra.properties"}) 
@EnableCassandraRepositories 
public class CassandraConfig extends AbstractCassandraConfiguration { 

    @Value("${cassandra.keyspace}") 
    private String cassandraKeyspace; 

    @Override 
    protected List<CreateKeyspaceSpecification> getKeyspaceCreations() { 
    return Collections.singletonList(CreateKeyspaceSpecification.createKeyspace(cassandraKeyspace) 
       .ifNotExists() 
       .with(KeyspaceOption.DURABLE_WRITES, true) 
       .withSimpleReplication()); 
    } 

    @Override 
    protected List<String> getStartupScripts() { 
    return Collections.singletonList("CREATE TABLE IF NOT EXISTS "+cassandraKeyspace+".test(id UUID PRIMARY KEY, greeting text, occurrence timestamp) WITH default_time_to_live = 600;"); 
    } 

} 
関連する問題