Spring Cassandra ddl-auto

标签 spring cassandra spring-data-cassandra

我正在将 Spring 与 Cassandra 结合使用,并且尝试将服务部署到生产中的现有 Cassandra 数据库,我一直在阅读有关 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 怎么样?我应该将它们设置为吗?或者仅仅拥有它们就足够了?

最佳答案

Spring Data Cassandra 可以为您在 Cassandra 中创建架构(表和类型)。默认情况下不启用。

  • 如果您使用 Spring Boot 和启动器 spring-boot-starter-data-cassandra,您可以在以下位置使用标志 spring.data.cassandra.schema-action您的application.yaml
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 boot 的情况下使用 Spring data 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 个具有相同数据并更改主键的表。如果您使用对象映射(对象=>表),您可能会想为不同的查询重用相同的bean..使用相同的表

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

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

关于Spring Cassandra ddl-auto,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69474481/

相关文章:

Spring JPA - 持久化嵌套对象

使用 IN 运算符在聚类列中更新和删除 Cassandra

cassandra - 使用CassandrSink进行Flink作业失败,并写入错误

java - spring-cassandra UDT数据插入

java - 如何使用 Spring Data Cassandra 将 java.util.Date 值插入到 Cassandra 日期类型列中?

java - 如何调试 Spring NoSuchBeanDefinitionException

Spring Web应用程序: doing something on startup (initialization)

java - 以编程方式创建 Spring Framework 任务?

cassandra - 取消 Cassandra 中正在进行的压缩作业

cassandra - 将 Joda 时间映射到 Cassandra 的 Date 类型