Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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
Database 当ALTERTABLE向具有现有数据记录的表中添加列时,Cassandra需要重新启动_Database_Cassandra_Cassandra 2.0_Dropwizard_Datastax - Fatal编程技术网

Database 当ALTERTABLE向具有现有数据记录的表中添加列时,Cassandra需要重新启动

Database 当ALTERTABLE向具有现有数据记录的表中添加列时,Cassandra需要重新启动,database,cassandra,cassandra-2.0,dropwizard,datastax,Database,Cassandra,Cassandra 2.0,Dropwizard,Datastax,数据库:Cassandra 2.1.2(单节点) 数据库驱动程序:Cassandra驱动程序2.1.6 应用程序:DropWizard 0.7.1 我的数据库中有一个简单的表: cqlsh:ugc> desc table person; CREATE TABLE abc.person ( id uuid PRIMARY KEY ) WITH bloom_filter_fp_chance = 0.01 AND caching = '{"keys":"ALL", "rows_

数据库:Cassandra 2.1.2(单节点)

数据库驱动程序:Cassandra驱动程序2.1.6

应用程序:DropWizard 0.7.1

我的数据库中有一个简单的表:

cqlsh:ugc> desc table person;

CREATE TABLE abc.person (
    id uuid PRIMARY KEY
) WITH bloom_filter_fp_chance = 0.01
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
    AND comment = ''
    AND compaction = {'min_threshold': '4', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';
表中包含一些数据:

cqlsh:ugc> select * from person;

 id
--------------------------------------
 bf56c8b1-ed0b-44d6-bd45-0d55dd73fbe0
在DropWizard应用程序中,我有一个映射对象:

@Table(name = "person")
public class Person {
    @PartitionKey
    @Column(name ="id")
    UUID id;


    public UUID getId() {
        return id;
    }

    public void setId(UUID id) {
        this.id = id;
    }
}
一切正常。我能够从DropWizard应用程序检索数据。然而,当我

1) 将新列“name”添加到表中

cqlsh:ugc> ALTER TABLE abc.person ADD name text;

cqlsh:ugc> desc table person;

CREATE TABLE abc.person (
    id uuid PRIMARY KEY,
    name text
) WITH bloom_filter_fp_chance = 0.01
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
    AND comment = ''
    AND compaction = {'min_threshold': '4', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';

cqlsh:ugc> select * from person;

 id                                   | name
--------------------------------------+------
 bf56c8b1-ed0b-44d6-bd45-0d55dd73fbe0 | null
2) 更新Person对象以映射新列

@Table(name = "person")
public class Person {
    @PartitionKey
    @Column(name ="id")
    UUID id;


    public UUID getId() {
        return id;
    }

    public void setId(UUID id) {
        this.id = id;
    }

    @Column(name = "name")
    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
3) 重新启动DropWizard应用程序

应用程序引发异常:

java.lang.IllegalArgumentException: "name" is not a column defined in this metadata
这个错误看起来像是说模型试图映射数据库表中不存在的列“name”,而实际上从数据库的角度来看它就在那里

但是,如果我重新启动数据库,它似乎可以解决问题

看起来,当您的表包含现有记录时,ALTERTABLE需要重新启动数据库。当表为空且添加了新列(不需要重新启动)时,不会发生此问题。我在[网站]上找不到任何关于我的情况的文档

问题:


有没有一种方法可以在不重新启动数据库的情况下更改表?如果有,我该怎么做?如果没有,有人能解释为什么需要重新启动数据库吗?

在我这方面,我不需要重新启动数据库来更新架构。我不知道如何重新启动应用程序。我建议您停止应用程序,并搜索是否有任何进程仍在运行打开应用程序并启动您的应用程序


重新启动应用程序时,DB的某些连接似乎没有中断,而您停止了DB,然后强制停止连接,然后更改工作。

我认为,重新启动DB时,您也没有解决问题,在重新创建表后,您解决了问题。我没有重新创建表。我只是重新启动了DB,似乎解决了问题否则,我将丢失所有旧数据。重新启动应用程序时,是否检查另一个java进程是否仍在运行该应用程序?没有其他进程正在运行。重新启动应用程序时,所有进程都将终止。更改空表上的架构正常工作,但当该表包含数据时,它将停止有一些问题,我不得不重新启动我的数据库。不知道为什么。