我正在使用db4o 8.0。 db4odatabase文件大小爲21MB。 數據庫中包含以下對象。db4o碎片整理刪除數據庫中的所有對象
User : There is 1 user in db.
PostedMessage : There are 10000 postedMessages in db.
我刪除了所有10000個發佈的消息。然後我嘗試對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個用戶對象。但是,在運行上述代碼之後,db4odatabase將變爲完全空的。爲什麼會發生這種情況?
如何避免丟失未刪除的其他對象(本例中爲1個用戶對象)?什麼是在db4o數據庫上進行碎片整理的正確方法?
我假設你將對一個更大的數據庫進行碎片整理,因爲21 MB的磁盤可能只需要0.2美分的成本。即它不值得。 –
這段代碼是否可以訪問'User'類?也就是說,如果你調用['Class.forName(「com.mypackage.User」);'](http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName %28java.lang.String%29)在這個代碼中與你的用戶類'FQCN,它會拋出一個異常嗎? – Brian
@Peter:我在開發過程中使用21 MB數據庫,僅用於測試目的。在生產過程中,預計將達到3至4 GB甚至更大。 –