首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >微流-无法在后续运行中更新存储

微流-无法在后续运行中更新存储
EN

Stack Overflow用户
提问于 2022-08-18 16:03:39
回答 1查看 48关注 0票数 1

我以https://github.com/microstream-one/examples/blob/master/loading/src/main/java/one/microstream/sampler/loading/Main.java为例

我对它进行了修改,以便在每次运行中添加新对象,但它只存储第一次运行的结果。后续运行显示原始的两次运行,而在当前运行中添加的两次运行,但不显示其他运行中添加的运行。

如何让它存储新的添加,以便在下一次运行中恢复它们?

代码语言:javascript
复制
package example;

import one.microstream.storage.embedded.types.EmbeddedStorage;
import one.microstream.storage.embedded.types.EmbeddedStorageManager;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class Main {
    public static void main(String[] args) {
        // Init storage manager
        final EmbeddedStorageManager storage = EmbeddedStorage.start();
        //storage.setRoot(null);

        MyRoot root;
        //if storage.root() returns null no data have been loaded
        //since there is no existing database, let's create a new one.
        if (storage.root() == null) {
            System.out.println("No existing Database found, creating a new one:");

            root = new MyRoot();
            storage.setRoot(root);
        }
        //storage.root() is not null so we have loaded data
        else {
            root = (MyRoot) storage.root();
            System.out.println("Existing Database found: " + root.myObjects.size());
        }

        root.myObjects.add(new MyData(UUID.randomUUID().toString()));
        root.myObjects.add(new MyData(UUID.randomUUID().toString()));
        storage.storeRoot();

        root.myObjects.forEach(System.out::println);
        storage.shutdown();
    }

    public static class MyRoot {
        public List<MyData> myObjects = new ArrayList<>();
    }

    public static class MyData {
        private String name;
        private int intValue;

        public MyData(final String content) {
            super();
            this.name = content;
        }

        public String getName() {
            return this.name;
        }

        public void setName(final String name) {
            this.name = name;
        }

        public int getIntegerValue() {
            return this.intValue;
        }

        public void setIntValue(final int integerValue) {
            this.intValue = integerValue;
        }

        @Override
        public String toString() {
            return this.name + " value: " + this.intValue;
        }
    }
}

我使用这些依赖项:

代码语言:javascript
复制
        <dependency>
            <groupId>one.microstream</groupId>
            <artifactId>microstream-storage-embedded</artifactId>
            <version>07.00.00-MS-GA</version>
        </dependency>
        <dependency>
            <groupId>one.microstream</groupId>
            <artifactId>microstream-storage-embedded-configuration</artifactId>
            <version>07.00.00-MS-GA</version>
        </dependency>
EN

回答 1

Stack Overflow用户

发布于 2022-08-19 06:47:42

我找到了原因。我认为storeRoot()方法是递归的,可以保存对root.myObjects的更改。事实证明并非如此,我必须显式地调用store(root.myObjects)。此外,在修改对象本身时,我必须调用store(dataObject) --这是修改过的代码,还有修改对象的其他示例:

代码语言:javascript
复制
public static void main(String[] args) {
    // Init storage manager
    final EmbeddedStorageManager storage = EmbeddedStorage.start();
//        storage.setRoot(null);
//        storage.storeRoot();

    MyRoot root;
    //if storage.root() returns null no data have been loaded
    //since there is no existing database, let's create a new one.
    if (storage.root() == null) {
        System.out.println("No existing Database found, creating a new one:");

        root = new MyRoot();
        storage.setRoot(root);
        storage.storeRoot();
    }
    //storage.root() is not null so we have loaded data
    else {
        root = (MyRoot) storage.root();
        System.out.println("Existing Database found: " + root.myObjects.size());
        root.myObjects.forEach(System.out::println);

        root.myObjects.forEach(o -> {
            o.setIntValue(root.myObjects.size());
        });
        storage.storeAll(root.myObjects);
    }

    root.myObjects.add(new MyData(UUID.randomUUID().toString()));
    root.myObjects.add(new MyData(UUID.randomUUID().toString()));
    storage.store(root.myObjects);

    storage.shutdown();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73406253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档