【问题标题】:db4o: serious problems and incoherencesdb4o:严重的问题和不一致
【发布时间】:2013-11-29 00:50:14
【问题描述】:

我试图通过调整我的 db4o 实例来弄清楚会发生什么,但这真的让我发疯:这对我来说根本没有意义。

基本上我正在创建两个对象并将第一个对象存储在第二个对象的 ArrayList 中。然后我想从整个数据库和我最初存储的列表中删除第一个对象。

这是我正在运行的操作的基本列表。

User user = new User("user");
Device device = new Device("device");
objectContainer.ext().store(user,5); // object storing depth
objectContainer.commit();

objectContainer.delete(device);

//objectContainer.close();
//objectContainer = new ...

此时,如果我关闭并重新打开 objectContainer,则用户 deviceList 包含一个空对象,而如果我不关闭容器(正常运行的应用程序通常应避免),则设备对象仍在用户对象内, 而它不在整个数据库中。

我只想在没有任何空对象的情况下从列表和数据库中删除该对象。这可能吗??我已经尝试了很多调整配置(弱引用、激活、约束...),但没有任何成功。

【问题讨论】:

    标签: c# java .net database db4o


    【解决方案1】:

    为什么重新打开后对象仍在列表中,但之前没有?

    • 如果您删除一个对象,它会在数据库中被删除。
    • 但是,db4o 不修改任何内存内容。因此,在重新打开之前,该集合是该集合在内存中的“旧”表示。它仍然包含对对象的引用。 db4o 不会删除它。
    • 重新打开后:从数据库加载集合。由于该对象已从数据库中删除,它将对不再存在的对象使用“空”引用。

    db4o 不会“神奇地”为您从内存对象中“移除”对象。您必须确保对象模型具有一致的状态,就像内存对象图中的任何其他对象一样。\

    这里有一些提示:http://community.versant.com/documentation/reference/db4o-8.1/net/reference/Content/best_practises/managing_relations.htm

    【讨论】:

    • 显然它也没有从数据库中删除,这个例子显示了它;
    • 只有当缓存中的任何其他对象都无法访问该对象时,该对象才真正被删除。因此,您必须从每个用于真正移除对象的位置移除对象。
    • 我重新创建了 DBManager,因此现在可以手动维护关系。我认为由于缓存的原因,不可能避免这种情况。即使尝试直接读取数据库也是不可能的,因为对象保存在 java 堆中,并在重新启动后立即删除。
    猜你喜欢
    • 2011-05-31
    • 2022-12-17
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多