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

如何使用 Spring 引导初始化 Cassandra 键空间和表

拓拔俊艾
2023-03-14

我使用Cassandra作为我的Spring boot应用程序的数据源,并希望在应用程序启动前初始化html" target="_blank">数据库。

到目前为止,我所做的是,我已经定义了一个类“CassandraConfiguration”,扩展了“AbstractCassandraConfiguration”类,如下面的示例所示,我有一个扩展“CassandraRepository”的存储库。当我自己创建键空间和表时,应用程序工作正常。

然而,我希望在应用程序启动时自动创建键空间和表。为此,我提供了一个模式。资源文件夹下的cql文件,但我无法使该脚本工作。

有人知道我该怎么做才能自动创建键空间和表吗?

谢谢。

编辑:我使用的是Cassandra 2.0.9,sping-boot1.3.2.RELEASE和datastax cassandra驱动程序2.1.6版本。

CassandraConfiguration.java

@Configuration
@PropertySource(value = { "classpath:cassandra.properties" })
@EnableCassandraRepositories(basePackages = { "bla.bla.bla.repository" })
public class CassandraConfiguration extends AbstractCassandraConfiguration {

    @Autowired
    private Environment environment;


    @Bean
    public CassandraClusterFactoryBean cluster() {
        CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean();
        cluster.setContactPoints( environment.getProperty( "cassandra.contactpoints" ) );
        cluster.setPort( Integer.parseInt( environment.getProperty( "cassandra.port" ) ) );
        return cluster;
    }


    @Bean
    public CassandraMappingContext cassandraMapping() throws ClassNotFoundException {
        return new BasicCassandraMappingContext();
    }


    @Bean
    public CassandraConverter converter() throws ClassNotFoundException {
        return new MappingCassandraConverter(cassandraMapping());
    }


    @Override
    protected String getKeyspaceName() {
        return environment.getProperty( "cassandra.keyspace" );
    }


    @Bean
    public CassandraSessionFactoryBean session() throws Exception {

        CassandraSessionFactoryBean session = new CassandraSessionFactoryBean();
        session.setCluster(cluster().getObject());
        session.setKeyspaceName(environment.getProperty("cassandra.keyspace"));
        session.setConverter(converter());
        session.setSchemaAction(SchemaAction.NONE);

        return session;
    }


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

共有3个答案

彭允晨
2023-03-14

我正在使用< code > spring-boot 1 . 5 . 10 . release 和< code>cassandra 3.0.16,但是您可以尝试缩减版本。要创建密钥空间,您可以从< code>application.yml或< code > application . properties 导入密钥空间名称。使用< code>@Table注释,您的表应该会自动生成,前提是您已经设置了实体基础包。

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

@Override
public String[] getEntityBasePackages() {
    return new String[]{"com.example.your.entities"};
}

@Override
protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
    return Arrays.asList(
            CreateKeyspaceSpecification.createKeyspace()
                    .name(keySpace)
                    .ifNotExists()
    );
}
贝镜
2023-03-14

您的返回类型基本卡桑德拉映射上下文() 可能已弃用。用

@Bean
public CassandraMappingContext mappingContext() throws ClassNotFoundException {
    CassandraMappingContext mappingContext= new CassandraMappingContext();
    mappingContext.setInitialEntitySet(getInitialEntitySet());
    return mappingContext;
}
@Override
public String[] getEntityBasePackages() {
    return new String[]{"base-package name of all your entity, annotated 
with @Table"};
}

@Override
protected Set<Class<?>> getInitialEntitySet() throws ClassNotFoundException {
    return CassandraEntityClassScanner.scan(getEntityBasePackages());
}

而不是,

@Bean
public CassandraMappingContext cassandraMapping() throws ClassNotFoundException {
    return new BasicCassandraMappingContext();
}

还设置:

session.setSchemaAction(SchemaAction.RECREATE_DROP_UNUSED);

和排除:

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

在此处获取参考。

督飞羽
2023-03-14

如果你仍然有这个问题,在Spring Boot 2和SD Cassandra 2.0.3中,你可以做这个简单的Java配置,设置一切开箱即用。

@Configuration
@EnableCassandraRepositories(basePackages = "com.example.repository")
public class DbConfigAutoStart extends AbstractCassandraConfiguration {

    /*
     * Provide a contact point to the configuration.
     */
    @Override
    public String getContactPoints() {
        return "exampleContactPointsUrl";
    }

    /*
     * Provide a keyspace name to the configuration.
     */
    @Override
    public String getKeyspaceName() {
        return "exampleKeyspace";
    }

    /*
     * Automatically creates a Keyspace if it doesn't exist
     */
    @Override
    protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
        CreateKeyspaceSpecification specification = CreateKeyspaceSpecification
                .createKeyspace("exampleKeyspace").ifNotExists()
                .with(KeyspaceOption.DURABLE_WRITES, true).withSimpleReplication();
        return Arrays.asList(specification);
    }


    /*
     * Automatically configure a table if doesn't exist
     */
    @Override
    public SchemaAction getSchemaAction() {
        return SchemaAction.CREATE_IF_NOT_EXISTS;
    }


    /*
     * Get the entity package (where the entity class has the @Table annotation)
     */
    @Override
    public String[] getEntityBasePackages() {
        return new String[] { "com.example.entity" };
    }

你可以走了

 类似资料:
  • 当云联壹云的First Node部署成功后,用户可根据使用场景快速引导配置云联壹云平台。 设置管理员用户 当First Node节点部署完成后,用户在浏览器中输入First Node节点的IP地址,如提示“您的连接不是私密连接”,请单击 “高级” 按钮,并单击“继续前往x.x.x.x(不安全)”,打开云管平台控制台。 在管理员注册页面,设置管理员账号、密码,单击 “注册” 按钮,创建管理员用户。

  • 我试图初始化一个< code>constexpr引用,但没有成功。我试过了 但我收到了编译时错误 错误:constexpr变量“z”必须由常量表达式初始化 删除< code>const会导致 错误:将对类型“int”的引用绑定到类型“const int”的值会删除限定符 尽管我感觉< code>constexpr自动暗示变量声明的< code>const。 所以我的问题是: < Li > < co

  • 问题内容: 我有一个卡桑德拉1.1.2安装我的系统为单节点集群上有三个keyspaces: ,和。我想尽可能地转储keyspace模式及其列族数据,并在其他Cassandra集群上恢复转储。谁能详细建议我该怎么做? 问题答案: 您可以使用和cassandra工具 退房Datastax 文档上相同,这也 您始终可以在文件中执行cassandra-cli命令 您可以将所有create语句加载到文件中并

  • 问题内容: 在将java.util.Date变量初始化为空时,我需要您的帮助。当我运行页面时,如果我没有选择任何日期,它将显示nullpointerexception。 代码是: 我试图使该变量为空,但是它不起作用> 但是,使用初始化: 上面的代码会给我一个我不想要的默认值。 问题答案: java.util.Date的 实例存储一个日期。那么,如何在其中什么也不存储呢?它只能存储对实例的引用。如果

  • 使用Cassandra,我想使用spring boot应用程序动态地创建键空间和表。我正在使用基于Java的配置。 我有一个用@table注释的实体,我想在应用程序启动之前创建它的模式,因为它有预先已知的固定字段。 但是,根据登录的用户,我还希望为这些用户动态创建额外的表,并能够将条目插入到这些表中。 有没有人可以指导我一些我可以利用的资源,或者指出我如何解决这些问题的正确方向。非常感谢你的帮助!

  • 在Cassandra中,“”命令用于从Cassandra中删除所有数据,列族,用户定义的类型和索引的键空间。 Cassandra在删除键空间之前,先获取键空间的快照。 如果Cassandra中不存在keyspace,Cassandra将返回错误,除非使用关键字。 语法 示例: 我们举一个例子来删除名为“”的键空间(keyspace)。 验证: 在执行上述命令后,从Cassandra中删除键空间“”