首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Microstream中正确使用BinaryHandler来存储易失性的长整型数组?

如何在Microstream中正确使用BinaryHandler来存储易失性的长整型数组?
EN

Stack Overflow用户
提问于 2021-09-16 19:28:36
回答 1查看 46关注 0票数 1

我试图用Microstream存储Eclipse Collection的LongArrayList (https://www.eclipse.org/collections/),但由于它的"items“字段是临时的,所以无法开箱即用。

所以我所做的就是创建一个新的类PersistableLongArrayList,如下所示:

代码语言:javascript
复制
public class PersistableLongArrayList extends LongArrayList {
    static BinaryTypeHandler<PersistableLongArrayList> provideTypeHandler() {
        return Binary.TypeHandler(PersistableLongArrayList.class,
            Binary.Field_int(
                "size", 
                list -> list.size, 
                (list, value) -> list.size = value
            ),
            Binary.Field(
                long[].class, "items", 
                list -> list.items, 
                (list, value) -> list.items = value
            )
        );
    } 
}

当从存储实例加载时,items字段现在不为空,但是,如果我后来更改了该值并调用storage.store(list),关闭数据库并重新启动它,则不会存储新值,只有大小会正确存储。

我添加了一个非常简单的示例来说明此行为:

代码语言:javascript
复制
public class SimpleTest {
    private PersistableLongArrayList root;

    public static void main(String[] args) {
        try {
            SimpleTest t = new SimpleTest();
            // DB erstellen
            EmbeddedStorageManager storage = t.startDB();
            // modify the list
            t.root.add(t.root.size() + 1);
            storage.store(t.root);
            // stop DB
            t.stopDB(storage);
            // restart DB
            storage = t.startDB();
            // show root element
            System.out.println(t.root);
            // Observed behavior: list "grows" from s.th. like this: [1] to s.th. like this [1, 0, 0, 0] after several runs (Probably only size grows and is stored correctly and therefore the fields up to "size" are printed but empty)
            // Expected beahvior: list starts with [1] and grows to something like this [1, 2, 3, 4] after several runs
        } catch (Throwable t) {
            t.printStackTrace();
        } finally {
            System.exit(0);
        }
    }

    private EmbeddedStorageManager startDB() {
        EmbeddedStorageManager storageManager = EmbeddedStorage.start();
        if(storageManager.root() == null) {
            PersistableLongArrayList list = new PersistableLongArrayList();
            storageManager.setRoot(list);
            storageManager.storeRoot();
            root = list;
        } else {
            root = (PersistableLongArrayList)storageManager.root();
        }
        return storageManager;
    }

    private void stopDB(EmbeddedStorageManager storageManager) {
        storageManager.shutdown();
    }
}

可能我只是误解了如何正确使用自定义BinaryHandler,但我现在不知道要更改什么。任何建议都是值得感谢的:)

致以良好的问候,托马斯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-21 12:21:34

使用自定义的PersistenceEagerStoringFieldEvaluator和PersistenceFieldEvaluator,可以直接持久化LongArrayList:

代码语言:javascript
复制
public class PersistenceFieldEvaluatorCustom implements PersistenceFieldEvaluator {

    @Override
    public boolean applies(final Class<?> entityType, final Field field) {

        //return true if field should be persisted, false if not
        if(entityType == org.eclipse.collections.impl.list.mutable.primitive.LongArrayList.class && field.getName().equals("items")) {
            return true;
        }

        //default: return false if field has the transient modifier
        return !XReflect.isTransient(field);
    }
}
代码语言:javascript
复制
public class PersistenceEagerStoringFieldEvaluatorCustom implements PersistenceEagerStoringFieldEvaluator {

    @Override
    public boolean isEagerStoring(final Class<?> t, final Field u) {

        //return true if field should be persisted at every store
        if(t == org.eclipse.collections.impl.list.mutable.primitive.LongArrayList.class && u.getName().equals("items")) {
            return true;
        }
        return false;
    }
}

设置:

代码语言:javascript
复制
final EmbeddedStorageManager s = EmbeddedStorage.Foundation()
                .onConnectionFoundation(
                        c->{ c.setFieldEvaluatorPersistable(new PersistenceFieldEvaluatorCustom());
                             c.setReferenceFieldEagerEvaluator(new PersistenceEagerStoringFieldEvaluatorCustom());
                        })
                .start();

诚挚的问候

有关更多细节,请参阅https://github.com/microstream-one/microstream/discussions/247

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69214124

复制
相关文章

相似问题

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