当前位置: 首页 > 知识库问答 >
问题:

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

韦安怡
2023-03-14

我有一个带有springcassandra的SpringBoot2项目,我正在使用@RefreshScope在运行时创建密钥空间,并且我正在执行查询以使用该密钥空间,但模式不是从带有@Table注释的实体创建的。

当我启动应用程序时,如果不存在,就会创建一个新的键空间,并创建模式。之后,我更改app.properties中的keyspace,并向actuator/refresh发送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个答案

关飞翼
2023-03-14

在Spring数据中,卡桑德拉的架构创建与会话工厂(卡桑德拉塞森工厂豆)相关联,密钥空间创建与集群实例(卡桑德拉集群工厂豆)相关联。您需要在两家工厂都投入@RefreshScope

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

 类似资料:
  • 我知道这是一个可怕的黑客行为,但我需要编辑一个外部库以符合我们项目的需要。我正在更改的项目将类映射存储到所述类的实例。这个项目的初衷是不可能有重复的类,但我需要它们。我的解决方案是对每个相关对象应用一个UniqueClass字段,然后每个对象都有一个对我需要创建其实例的类的引用。这样,UniqueClass是什么其实根本不重要,只是它是唯一的。 现在,我需要一种方法在运行时创建一个唯一的类来存储在

  • 我使用的是spring数据。下面是我的配置类。我的期望是,当spring boot应用程序加载时,它必须连接到Cassandra并创建密钥空间。但我的应用程序能够连接到Cassandra,但它没有创建密钥空间。我在启动时收到以下异常。如果我遗漏了什么,请告诉我。 通过构造函数参数5表示的未满足依赖关系;嵌套的异常是org。springframework。豆。工厂BeanCreationExcept

  • 我在访问另一个命名空间中存在的服务时遇到问题。 我有两个名称空间(在同一个集群中)airflow-dev和dask-dev。 在dask-dev名称空间中,我部署了dask集群(dask调度器和工作器)。此外,还为dask-scheduler pod创建了一个服务(集群IP)。我可以使用“kubectl port-forward”命令从chrome访问dask-scheduler pod。 然而,

  • 主要内容:什么是键空间(Keyspace)?,Cassandra Keyspace的不同组件Cassandra查询语言(CQL)可帮助开发人员与Cassandra沟通交互。 Cassandra查询语言的语法与SQL非常相似。 什么是键空间(Keyspace)? 键空间()是用于保存列族,用户定义类型的对象。 键空间(Keyspace)就像RDBMS中的数据库,其中包含列族,索引,用户定义类型,数据中心意识,键空间(Keyspace)中使用的策略,复制因子等。 在Cassandra中,“”

  • 问题内容: 现在我用 但这有点棘手。是否有“标准”方法在Node.js中创建空文件? 问题答案: 如果要强制文件为空,则要改用标志: 如果文件存在,它将截断文件,如果文件不存在,则将创建文件。 如果不需要返回的文件描述符,则将其包装在调用中。