gpt4 book ai didi

java - db4o Defragment 删除数据库中的所有对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:32:19 26 4
gpt4 key购买 nike

我正在使用 db4o 8.0。db4odatabase 文件大小为 21MB。数据库中有以下对象。

User : There is 1 user in db.
PostedMessage : There are 10000 postedMessages in db.

我删除了所有 10000 条 PostedMessages。然后我尝试对 db4o 数据库进行碎片整理。以下代码用于碎片整理。

private void processDefrag() {
try {
String dbpath = "D:\\db4oDatabase";

IdMapping mapping = new InMemoryIdMapping();
//new DatabaseIdMapping(dbpath); //use this if heap overflows

DefragmentConfig config = new DefragmentConfig(dbpath, dbpath+".bak", mapping);
config.storedClassFilter(new AvailableClassFilter());
config.forceBackupDelete(false);
config.objectCommitFrequency(1000);
Defragment.defrag(config);
System.out.println("Defrag completed");

} catch (IOException ex) {
ex.printStackTrace();
}
}

我的预期是 db4oDatabase 文件大小会回到 21 Kb。并且 db4oDatabase 中仍将包含 1 个用户对象。然而,在运行上面的代码之后,db4o 数据库变得完全空了。为什么会这样?

如何避免丢失其他未删除的对象(在本例中为 1 个用户对象)?对 db4o 数据库进行碎片整理的正确方法是什么?

最佳答案

如果因为找不到该类而不接受该类,您可以尝试编写 StoredClassFilter你自己的,只接受所有 StoredClass 对象。

public class AcceptAllClassFilter implements StoredClassFilter {

@Override
public boolean accept(StoredClass storedClass) {
return true;
}
}

然后:

config.storedClassFilter(new AcceptAllClassFilter());

除非碎片整理过程自动删除没有 StoredClass 的所有内容,否则这将起作用。如果是这种情况,我们可能需要弄清楚为什么 User 类没有容器对应的 StoredClass 实例。

关于java - db4o Defragment 删除数据库中的所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12355384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com