【问题标题】:Spring Cassandra ddl-autoSpring Cassandra ddl-auto
【发布时间】:2021-11-27 03:37:41
【问题描述】:

我正在将 Spring 与 Cassandra 一起使用,并且我正在尝试将服务部署到生产中的现有 Cassandra DB,我一直在阅读有关 ddl-auto 的信息,但我不确定我的代码是否会覆盖该方案或那里的数据。

这些是我的依赖项,

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-cassandra</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

</dependencies>

我正在使用以下内容来查询存储库,

import org.springframework.data.cassandra.repository.CassandraRepository;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
...
...

@Repository
public interface PostsRepo extends CrudRepository<Posts, String> {
    Optional<Posts> findBypostid(String id);

}

我的项目中没有任何sql文件,我的application.properties文件是空的。

我的问题是

  1. 我是否需要专门定义一些内容来停止/禁用自动架构创建
  2. 自动创建架构选项是否只适用于嵌入式数据库,这里没有什么可担心的吗?
  3. spring.jpa.hibernate.ddlspring.jpa.defer-datasource-initialization 怎么样?我应该将它们设置为 nonefalse 吗?还是没有它们就足够了?

【问题讨论】:

  • 我的问题的答案是here

标签: spring cassandra spring-data-cassandra


【解决方案1】:

Spring Data Cassandra 可以在 Cassandra 中为您创建模式(表和类型)。默认不启用。

  • 如果您使用 Spring Boot 和启动器 spring-boot-starter-data-cassandra,您可以在 application.yaml 中使用标志 spring.data.cassandra.schema-action
spring:
  data:
    cassandra:
      keyspace-name: sample keyspace
      username: token
      password: passwd
      schema-action: create-if-not-exists
      request:
        timeout: 10s
      connection:
        connect-timeout: 10s
        init-query-timeout: 10s
  • 如果您在没有 Spring 引导的情况下使用 Spring 数据 cassandra,您可以从 AbstractCassandraConfiguration 继承并覆盖方法 getSchemaAction,如下所述:
@Configuration
@EnableCassandraRepositories
public class CassandraConfig extends AbstractCassandraConfiguration {

  @Value("${cassandra.contactpoints}")
  private String contactPoints;

  @Value("${cassandra.port}")
  private int port;

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

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

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

  @Override
  protected String getContactPoints() {
    return contactPoints;
  }

  @Override
  protected int getPort() {
    return port;
  }

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

  @Override
  public String[] getEntityBasePackages() {
    return new String[] {basePackages};
  }
}

the official Spring documentation 中引用的字段允许有多个值:

  • SchemaAction.NONE: 没有创建或删除任何表或类型。这是默认设置。

  • SchemaAction.CREATE: 从带有@Table 注释的实体和带有@UserDefinedType 注释的类型创建表、索引和用户定义类型。如果您尝试创建类型,现有表或类型会导致错误。

  • SchemaAction.CREATE_IF_NOT_EXISTS: 与 SchemaAction.CREATE 类似,但应用了 IF NOT EXISTS。现有的表或类型不会导致任何错误,但可能仍然过时。

  • SchemaAction.RECREATE: 删除并重新创建已知使用的现有表和类型。未在应用程序中配置的表和类型不会被删除。

  • SchemaAction.RECREATE_DROP_UNUSED: 删除所有表和类型并仅重新创建已知表和类型。

如果该功能可能对您的开发有用,不建议使用它,特别是在生产中这是我的理由:

  • 使用 Cassandra 实现高效数据模型的方法是首先设计查询,然后根据它们定义所需的表。如果 2 个查询使用相同的数据,建议使用相同的数据创建 2 个表来更改主键。如果您使用对象映射 (object=>Table),您可能会想为不同的查询重用同一个 bean ......使用同一个表

  • 在生产环境中创建架构需要微调 DDL 请求(覆盖 TTL、压缩策略、启用 NodeSync、特殊属性)

  • 人为错误。如果你让你schema-actionRECREATE...祝你好运。

【讨论】:

    猜你喜欢
    • 2020-02-25
    • 1970-01-01
    • 2019-03-17
    • 2018-06-15
    • 2023-04-05
    • 2016-05-07
    • 1970-01-01
    • 2015-11-17
    • 2019-10-29
    相关资源
    最近更新 更多