Spring Cassandra:在另一个键空间中的运行时创建模式

Posted

技术标签:

【中文标题】Spring Cassandra:在另一个键空间中的运行时创建模式【英文标题】:Spring Cassandra: Creating Schema in run time in another keyspace 【发布时间】:2019-06-18 01:24:12 【问题描述】:

我有带有 spring-cassandra 的 Spring Boot 2 项目,我在运行时使用 @RefreshScope 创建键空间,我正在执行查询以使用该键空间,但架构不是从带有 @Table 注释的实体创建的。

当我启动应用程序时,如果不存在新的键空间,则会创建一个新的键空间并创建模式。之后,我更改了 app.properties 中的键空间并将 POST 请求发送到执行器/刷新。新的键空间已创建并正在使用,但架构并未在该键空间中创建。

这是我的 Cassandra 配置:

@Configuration
@EnableCassandraRepositories
public class CassandraConfig extends AbstractCassandraConfiguration 

  @Value("$cassandra.port")
  private int cassandraPort;
  @Value("$cassandra.keyspace")
  private String KEYSPACE;
  @Value("$cassandra.contactpoints")
  private String NODES;

  @Bean
  @Override
  public CassandraCqlClusterFactoryBean cluster() 
    CassandraCqlClusterFactoryBean bean = new CassandraCqlClusterFactoryBean();
    bean.setKeyspaceCreations(getKeyspaceCreations());
    bean.setContactPoints(NODES);
    bean.setPort(cassandraPort);
    return bean;
  

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

  @Override
  protected String getKeyspaceName() 
    return KEYSPACE;
  

  @Override
  protected String getContactPoints() 
    return NODES;
  

  @Override
  protected int getPort() 
    return cassandraPort;
  

  @Override
  public String[] getEntityBasePackages() 
    return new String[] "package.entities";
  

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

  // Below method creates "keyspace" if it doesn't exist.
  private CreateKeyspaceSpecification getKeySpaceSpecification() 
    DataCenterReplication dcr = DataCenterReplication.of("datacenter1", 3L);
    return CreateKeyspaceSpecification.createKeyspace(KEYSPACE)
        .ifNotExists()
        .withNetworkReplication(dcr);
  

这是 RefreshScope 类:

@Component
class MySessionRefresh extends AbstractCassandraConfiguration

  @Autowired
  Environment env;

  @Autowired
  Session session;

  @EventListener
  @Order(Ordered.HIGHEST_PRECEDENCE)
  public void handle(RefreshScopeRefreshedEvent event) 

    String keyspace = env.getProperty("cassandra.keyspace");
    session.execute("CREATE KEYSPACE IF NOT EXISTS " + keyspace + " WITH REPLICATION =  'class' : 'NetworkTopologyStrategy', 'datacenter1' : 3 ;");
    session.execute("USE " + keyspace + " ;");

  

我还需要做什么才能在运行时使用 @Table 为新的键空间自动创建实体模式?

【问题讨论】:

【参考方案1】:

Spring Data Cassandra 中的模式创建与会话工厂 (CassandraSessionFactoryBean) 相关联,键空间创建与 Cluster 实例 (CassandraClusterFactoryBean) 相关联。您需要在两个工厂都输入@RefreshScope

请记住,刷新会中断您的 Cassandra 操作。您还应该注意,模式创建不适用于生产用途。它的设计考虑了集成测试和快速应用程序开发。

【讨论】:

这些是否被添加到上面的 CassandraConfig 或 MySessionRefresh 类中?你是怎么想出来的?有相关文档的链接吗?我正在努力解决类似的问题。

以上是关于Spring Cassandra:在另一个键空间中的运行时创建模式的主要内容,如果未能解决你的问题,请参考以下文章

如何动态设置 Spring Data Cassandra 键空间?

spring-data-cassandra 存储库的多个键空间支持?

Cassandra 分区键可以跨一个键空间中的多个表吗?

如果键空间不存在,Cassandra 连接到集群

Cassandra 多个键空间或列族?

Spark + cassandra:如何创建键空间?