Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Spring boot初始化Cassandra键空间和表_Cassandra_Spring Boot_Spring Data Cassandra - Fatal编程技术网

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

如何使用Spring boot初始化Cassandra键空间和表,cassandra,spring-boot,spring-data-cassandra,Cassandra,Spring Boot,Spring Data Cassandra,我在Spring boot应用程序中使用Cassandra作为数据源,希望在应用程序启动之前初始化数据库 到目前为止,我已经定义了一个类“CassandraConfiguration”,扩展了“AbstractCassandraConfiguration”类,如下面的示例所示,我还有一个扩展“CassandraRepository”的存储库。当我自己创建键空间和表时,应用程序运行良好 但是,我希望在应用程序启动时自动创建键空间和表。为了做到这一点,我在resources文件夹下提供了一个sche

我在Spring boot应用程序中使用Cassandra作为数据源,希望在应用程序启动之前初始化数据库

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

但是,我希望在应用程序启动时自动创建键空间和表。为了做到这一点,我在resources文件夹下提供了一个schema.cql文件,但无法使该脚本正常工作

有人知道我能做些什么来自动创建键空间和表吗

谢谢

编辑:我使用的是Cassandra 2.0.9、spring boot 1.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;
    }
}
您的返回类型basicassandramappingcontext()可能不推荐使用。使用

@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());
}
还设置:

session.setSchemaAction(SchemaAction.RECREATE_DROP_UNUSED);
并排除:

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

获取参考资料。

如果您在这方面仍然有问题,在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" };
    }
@配置
@EnableCassandraRepositories(basePackages=“com.example.repository”)
公共类DbConfigAutoStart扩展了AbstractCassandraConfiguration{
/*
*为配置提供一个接触点。
*/
@凌驾
公共字符串getContactPoints(){
返回“exampleContactPointsUrl”;
}
/*
*为配置提供键空间名称。
*/
@凌驾
公共字符串getKeyspaceName(){
返回“exampleKeyspace”;
}
/*
*如果键空间不存在,则自动创建键空间
*/
@凌驾
受保护列表getKeyspaceCreations(){
CreateKeyspaceSpecification=CreateKeyspaceSpecification
.createKeyspace(“exampleKeyspace”).ifNotExists()
.with(keyspacepoption.dustable_WRITES,true)。with impleReplication();
返回数组.asList(规范);
}
/*
*如果不存在表,则自动配置表
*/
@凌驾
公共SchemaAction getSchemaAction(){
如果不存在,则返回SchemaAction.CREATE\u;
}
/*
*获取实体包(其中实体类具有@Table注释)
*/
@凌驾
公共字符串[]getEntityBasePackages(){
返回新字符串[]{“com.example.entity”};
}

您现在可以使用
spring boot 1.5.10了我正在使用
spring boot 1.5.10。发布
cassandra 3.0.16
但是您可以尝试缩小版本的大小。要创建键空间,您可以从
应用程序.yml
应用程序.properties
导入键空间名称。使用
@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()
    );
}
@Value(${cassandra.keyspace}”)
私有字符串键空间;
@凌驾
公共字符串[]getEntityBasePackages(){
返回新字符串[]{“com.example.your.entities”};
}
@凌驾
受保护列表getKeyspaceCreations(){
返回数组.asList(
CreateKeyspaceSpecification.createKeyspace()
.name(键空间)
.ifNotExists()
);
}

最后,我将setKeyspaceCreations(getKeyspaceCreations())添加到CassandraClusterFactoryBean覆盖中,并确保启用@ComponentScan,从而使其工作正常

import com.datastax.driver.core.PlainTextAuthProvider;
import com.datastax.driver.core.policies.ConstantReconnectionPolicy;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.cassandra.config.*;
import org.springframework.data.cassandra.core.cql.keyspace.CreateKeyspaceSpecification;
import org.springframework.data.cassandra.core.cql.keyspace.DropKeyspaceSpecification;
import org.springframework.data.cassandra.core.cql.keyspace.KeyspaceOption;
import org.springframework.data.cassandra.repository.config.EnableReactiveCassandraRepositories;

import java.util.Arrays;
import java.util.List;



@Configuration
@EnableReactiveCassandraRepositories(basePackages = "com.company.domain.data")
public class CassandraConfig extends AbstractReactiveCassandraConfiguration{
@Value("${spring.data.cassandra.contactpoints}") private String contactPoints;
@Value("${spring.data.cassandra.port}") private int port;
@Value("${spring.data.cassandra.keyspace-name}") private String keyspace;

@Value("${spring.data.cassandra.username}") private String userName;
@Value("${spring.data.cassandra.password}") private String password;
@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[]{"com.company.domain.data"};
}

@Override
public CassandraClusterFactoryBean cluster() {
    PlainTextAuthProvider authProvider = new PlainTextAuthProvider(userName, password);

    CassandraClusterFactoryBean cluster=new CassandraClusterFactoryBean();

    cluster.setJmxReportingEnabled(false);
    cluster.setContactPoints(contactPoints);
    cluster.setPort(port);
    cluster.setAuthProvider(authProvider);
    cluster.setKeyspaceCreations(getKeyspaceCreations());
    cluster.setReconnectionPolicy(new ConstantReconnectionPolicy(1000));

    return cluster;
}


@Override
protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {

    CreateKeyspaceSpecification specification = CreateKeyspaceSpecification.createKeyspace(keyspace)
            .ifNotExists()
            .with(KeyspaceOption.DURABLE_WRITES, true);

    return Arrays.asList(specification);
}



@Override
protected List<DropKeyspaceSpecification> getKeyspaceDrops() {
    return Arrays.asList(DropKeyspaceSpecification.dropKeyspace(keyspace));
}



}
导入com.datastax.driver.core.PlainTextAuthProvider;
导入com.datastax.driver.core.policies.ConstantReconnectionPolicy;
导入org.springframework.beans.factory.annotation.Value;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.data.cassandra.config.*;
导入org.springframework.data.cassandra.core.cql.keyspace.createkeyspace规范;
导入org.springframework.data.cassandra.core.cql.keyspace.dropkeyspace规范;
导入org.springframework.data.cassandra.core.cql.keyspace.keyspacepoption;
导入org.springframework.data.cassandra.repository.config.enableActiveCassandraRepositories;
导入java.util.array;
导入java.util.List;
@配置
@EnableReactiveCassandraRepositories(basePackages=“com.company.domain.data”)
公共类CassandraConfig扩展了AbstractReactiveCassandraConfiguration{
@值(${spring.data.cassandra.contactpoints}”)私有字符串contactpoints;
@值(${spring.data.cassandra.port}”)私有int端口;
@值(“${spring.data.cassandra.keyspace name}”)私有字符串键空间;
@值(“${spring.data.cassandra.username}”)私有字符串用户名;
@值(“${spring.data.cassandra.password}”)私有字符串密码;
@值(${cassandra.basepackages}”)私有字符串basepackages;
@重写受保护的字符串getKeyspaceName(){
返回键空间;
}
@重写受保护的字符串getContactPoints(){
返回触点;
}
@重写受保护的int getPort(){
返回端口;
}
@重写公共SchemaAction getSchemaAction(){
如果不存在,则返回SchemaAction.CREATE\u;
}
@凌驾
公共字符串[]getEntityBasePackages(){
返回新字符串[]{“com.company.domain.data”};
}
@凌驾
公共CassandracClusterFactoryBean集群(){
PlainTextAuthProvider authProvider=新的PlainTextAuthProvider(用户名、密码);
CassandraClusterFactoryBean集群=新的CassandraClusterFactoryBean();
cluster.setJmxReportingEnabled(false);
集群。设置触点(触点);
集群设置端口(端口);
setAuthProvider(authProvider);
setKeyspaceCreations(getKeyspaceCreations());
cluster.setReconnectionPolicy(新ConstantReconnectionPolicy(1000));
返回簇;
}
@凌驾
受保护列表getKeyspaceCreations(){
CreateKeyspaceSpecification规范=CreateKeysp
import com.datastax.driver.core.PlainTextAuthProvider;
import com.datastax.driver.core.policies.ConstantReconnectionPolicy;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.cassandra.config.*;
import org.springframework.data.cassandra.core.cql.keyspace.CreateKeyspaceSpecification;
import org.springframework.data.cassandra.core.cql.keyspace.DropKeyspaceSpecification;
import org.springframework.data.cassandra.core.cql.keyspace.KeyspaceOption;
import org.springframework.data.cassandra.repository.config.EnableReactiveCassandraRepositories;

import java.util.Arrays;
import java.util.List;



@Configuration
@EnableReactiveCassandraRepositories(basePackages = "com.company.domain.data")
public class CassandraConfig extends AbstractReactiveCassandraConfiguration{
@Value("${spring.data.cassandra.contactpoints}") private String contactPoints;
@Value("${spring.data.cassandra.port}") private int port;
@Value("${spring.data.cassandra.keyspace-name}") private String keyspace;

@Value("${spring.data.cassandra.username}") private String userName;
@Value("${spring.data.cassandra.password}") private String password;
@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[]{"com.company.domain.data"};
}

@Override
public CassandraClusterFactoryBean cluster() {
    PlainTextAuthProvider authProvider = new PlainTextAuthProvider(userName, password);

    CassandraClusterFactoryBean cluster=new CassandraClusterFactoryBean();

    cluster.setJmxReportingEnabled(false);
    cluster.setContactPoints(contactPoints);
    cluster.setPort(port);
    cluster.setAuthProvider(authProvider);
    cluster.setKeyspaceCreations(getKeyspaceCreations());
    cluster.setReconnectionPolicy(new ConstantReconnectionPolicy(1000));

    return cluster;
}


@Override
protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {

    CreateKeyspaceSpecification specification = CreateKeyspaceSpecification.createKeyspace(keyspace)
            .ifNotExists()
            .with(KeyspaceOption.DURABLE_WRITES, true);

    return Arrays.asList(specification);
}



@Override
protected List<DropKeyspaceSpecification> getKeyspaceDrops() {
    return Arrays.asList(DropKeyspaceSpecification.dropKeyspace(keyspace));
}



}