2014-09-10 112 views
7

Spring Data Cassandra是否支持同一應用程序上下文中的多個鍵空間存儲庫?我使用以下JavaConfig類對spring-data-cassandra存儲庫有多個密鑰空間支持?

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

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

我試圖移動存儲庫類不同的包之後創建第二配置類建立卡桑德拉彈簧數據配置。

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

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

但是在這種情況下,如果存儲庫的第一個集合失敗,因爲沒有在鍵空間中找到爲實體配置的列家族。我認爲它可能是在第二個鍵空間尋找列家族。

是否spring-data-cassandra支持多個keyspace存儲庫?我發現多個密鑰空間的唯一參考是here。但是它不能解釋這是否可以通過存儲庫完成?

+0

我轉發這誰處理大部分的庫編碼的讓你的回答工程師..坐好。 – 2014-09-19 03:53:32

回答

1

嘗試爲每個密鑰空間明確命名您的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()); 
} 

...在你的第二個配置:

@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()); 
} 

我認爲這可能做的伎倆。如果沒有,請回復。

+0

我會試試這個,然後回來。 – Saket 2014-09-26 10:27:26

+0

它是如此工作? – 2014-11-05 15:32:32

+0

無法找到存儲庫bean。 – anuj 2017-08-17 10:07:24

0

似乎建議在由一個會話管理的查詢中使用完全限定的密鑰空間名稱,因爲會話不是非常輕量級的。
請參閱參考here

0

我試過這種方法。然而,在嘗試訪問列族2時遇到了異常。列族1的操作似乎沒有問題。

我猜測,因爲底層CassandraSessionFactoryBean bean是一個單身人士。這將導致 未配置的ColumnFamily columnfamily2

下面是一些日誌提供上下文

DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - 返回singleton的bean的緩存實例 '的entityManagerFactory' DEBUG org.springframework .beans.factory.support.DefaultListableBeanFactory - 返回單豆「會話」 DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory的緩存實例 - 回到單身豆「集羣」

org.springframework.cassandra的緩存實例.sup port.exception.CassandraInvalidQueryException:未配置的columnfamily shardgroup;嵌套異常是com.datastax.driver.core.exceptions.InvalidQueryException:未配置的ColumnFamily columnfamily2 在org.springframework.cassandra.support.CassandraExceptionTranslator.translateExceptionIfPossible(CassandraExceptionTranslator.java:116) 在org.springframework.cassandra.config.CassandraCqlSessionFactoryBean。 translateExceptionIfPossible(CassandraCqlSessionFactoryBean.java:74)

0

嗯。無法評論馬修亞當斯的答案。但是,這將重用會話對象,因爲AbstractCassandraConfiguration在所有相關的getter上用@Bean註釋。

在一個類似的設置中,我最初的工作是覆蓋所有的getter,並且給它們賦予不同的bean名稱。但由於Spring仍然聲稱需要名稱的bean。我現在必須製作一份AbstractCassandraConfiguration的副本,而不需要我可以繼承的註釋。

確保公開CassandraTemplate,以便您可以從@EnableCassandraRepositories中引用它,如果使用這些。

我也有一個單獨的AbstractClusterConfiguration實現來公開一個通用的CassandraCqlClusterFactoryBean,所以底層連接被重用。

編輯: 我猜根據bclarance鏈接的電子郵件線程,應該真的嘗試重用Session對象。看起來是那樣的彈簧卡珊德拉的數據是不是真的成立了,雖然

+0

我的方法的一個問題是Session對象是在CassandraCqlSessionFactoryBean的afterPropertiesSet中創建的。所以它需要在Spring中成爲一個Bean來發生 – Kristoffer 2015-08-20 09:05:05

2

工作APP樣本: http://valchkou.com/spring-boot-cassandra.html#multikeyspace

你需要覆蓋默認豆理念如下:SessionFactory和模板

樣品:

1)application.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> { 
// .... 
} 
+0

無法找到存儲庫 – anuj 2017-08-17 12:07:57