3

私はdb4o 8.0を使用しています。db4odatabase ファイルのサイズは 21MB です。データベースには次のオブジェクトがあります。

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

10000 件の PostedMessage をすべて削除します。次に、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 つの User オブジェクトが含まれます。ただし、上記のコードを実行すると、db4odatabase は完全に空になります。なぜそのようなことが起こっているのですか?

削除されなかった他のオブジェクト (この場合は 1 ユーザー オブジェクト) が失われないようにするにはどうすればよいですか? db4o データベースで最適化を行う正しい方法は何ですか?

4

3 に答える 3

2

クラスが見つからないためにクラスを受け入れない場合は、すべてのオブジェクトStoredClassFilterを受け入れる独自の を作成してみてください。StoredClass

public class AcceptAllClassFilter implements StoredClassFilter {

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

それで:

config.storedClassFilter(new AcceptAllClassFilter());

これは、最適化プロセスが自動的にすべてを削除しない限り機能しStoredClassます。この場合、クラスがコンテナーにUser対応するインスタンスを持たない理由を突き止める必要があるかもしれません。StoredClass

于 2012-09-10T19:02:50.837 に答える
0
public static void printStoredClasses(ObjectContainer db) {
    StoredClass[] storedClasses = db.ext().storedClasses();
    for (StoredClass sc : storedClasses) {
        try {        
            Class<?> c = Class.forName(sc.getName());
            DebugMessagePrinter.print(c.getName());
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
    }
}

上記のメソッドを使用して、保存されているクラスを印刷しました。そして、ブライアンが推測したように、何らかの理由で、Userクラス名とPostedMessageクラス名は出力されませんでした。これは、db4oデータベースファイルでこれらのクラスを表示できないことを意味します。

于 2012-09-10T19:59:57.020 に答える
0

最後に、Brian の AcceptAllFilter クラスの助けを借りて、db4oDatabase ファイルを正常にデフラグすることができました。サイズは 21 MB から 12 MB に縮小されました。作業方法を以下に示します。

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

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

        DefragmentConfig config = new DefragmentConfig(dbpath, dbpath+".bak2", mapping);
        config.storedClassFilter(new AcceptAllClassFilter());
        config.forceBackupDelete(false);
        config.objectCommitFrequency(1000);
        config.db4oConfig().add(new UuidSupport());
        Defragment.defrag(config);
        System.out.println("Defrag completed" + t.s());

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

ところで、最適化は最高の状態で機能していないようです。10000 個の PostedMessage オブジェクトを削除した後、データベースには 1 つのユーザー オブジェクトしか含まれていませんでした。データベース ファイルのサイズは KB 単位になると思います。

しかし、彼らが言うように、何もないよりは何かが優れています。このある程度の成功により、私はより良いデフラグを探し続けます。より良い結果が得られたら、ここに投稿します。

于 2012-09-10T20:06:45.943 に答える