我正在将 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 文件为空。
我的问题是
- 我是否需要专门定义一些内容来停止/禁用自动架构创建?
- 自动架构创建选项是否仅适用于嵌入式数据库,因此无需担心?
- spring.jpa.hibernate.ddl 或 spring.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-action
来RECREATE
...祝你好运。
关于Spring Cassandra ddl-auto,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69474481/