използване на BerkeleyDB за замяна на java.util.List

някой може би има примерен код как да замени java списък (LinkedList или ArrayList) с нещо подобно в BerkeleyDB? Проблемът ми е, че трябва да заменя Lists, за да надхвърля ограниченията на основната памет. Някакъв прост примерен код би бил наистина добър.

Сега използвах просто TupleBinding за Integers (ключове) и SerialBinding за Diff-class (стойности на данни).

Сега получавам грешката:

14:03:29.287 [pool-5-thread-1] ERROR o.t.g.view.model.TraverseCompareTree - org.treetank.diff.Diff; local class incompatible: stream classdesc serialVersionUID = 8484615870884317488, local class serialVersionUID = -8805161170968505227

java.io.InvalidClassException: org.treetank.diff.Diff; локален клас несъвместим: поток classdesc serialVersionUID = 8484615870884317488, локален клас serialVersionUID = -8805161170968505227

Класовете слушател и TransactionRunner, които използвам, са:

/** {@inheritDoc} */
@Override
public void diffListener(final EDiff paramDiff, final IStructuralItem paramNewNode,
    final IStructuralItem paramOldNode, final DiffDepth paramDepth) {
    try {
        mRunner.run(new PopulateDatabase(mDiffDatabase, mKey++, new Diff(paramDiff, paramNewNode.getNodeKey(), paramOldNode.getNodeKey(), paramDepth)));
    } catch (final Exception e) {
        LOGWRAPPER.error(e.getMessage(), e);
    }
}

private static class PopulateDatabase implements TransactionWorker {

    private StoredMap<Integer, Diff> mMap;
    private int mKey;
    private Diff mValue;

    public PopulateDatabase(final DiffDatabase paramDatabase, final int paramKey, final Diff paramValue) {
        Objects.requireNonNull(paramDatabase);
        Objects.requireNonNull(paramValue);
        mMap = paramDatabase.getMap();
        mKey = paramKey;
        mValue = paramValue;
    }

    @Override
    public void doWork() throws DatabaseException {
        mMap.put(mKey, mValue);
    }
}

Не знам защо не става :-/

Редактиране: Съжалявам, просто трябваше да изтрия генерираната среда/база данни и да създам нова.


person Johannes    schedule 01.09.2011    source източник


Отговори (2)


Страхувам се, че няма да е толкова просто. Първата стъпка, която може да искате да предприемете, е да преработите кода си, за да преместите всички достъпи до списъка в отделен клас (наречете го DAO, ако желаете). Тогава ще бъде много по-лесно да преминете към база данни, вместо към списъка.

person nfechner    schedule 01.09.2011
comment
Предполагам, че трябва да съхранявам прости числа (0 до List.size()) като ключове и след това да използвам абстракция от база данни, за да получа действителните данни, хм. - person Johannes; 01.09.2011
comment

(Не знам дали това е нещо специфично или различно с Xcode 4.2.)

Създавам моите изгледи/контролери програмно и не използвам създател на интерфейси или пера и т.н. Може ли някой да ми каже каква е разликата между създаването на проект, който е „празно“ приложение спрямо приложение с „единичен изглед“? Първият има само делегат на приложението, а вторият има предоставен делегат и контролер, но се чудех дали има някаква разлика, за която трябва да се притеснявам.

Обикновено се стремя моят основен/главен контролер да създаде основен празен изглед, към който прикачвам и отделям изгледи, докато добавям/премахвам екрани. Моето предчувствие е, че може и да отида с проекта за единичен изглед, но се чудя дали има някаква бъркотия, която този проект има, която трябва да избегна, като просто направя празен проект.

Между другото, използвам този празен основен изглед, защото (ако си спомням правилно) имаше някои странни проблеми с автоматичното завъртане, свързани с размяната на основния изглед (в сравнение със стабилен основен изглед, който просто разменя своя подизглед). Ако това е загуба на време, ще се радвам и това да бъде изяснено.

- person nfechner; 01.09.2011

Berkeley DB е сериозно преуморен за този тип задачи. Това е справедлив звяр за конфигуриране и настройка, освен това вярвам, че лицензът вече е търговски. Ще бъдете много по-добре, ако използвате списък или карта, поддържан на диск. Като пример за последното, разгледайте Kyoto Cabinet. Той е изключително бърз, прилага стандартния интерфейс на Java Collections и е лесен за използване като списък или карта. Вижте другия ми отговор например код.

person Richard H    schedule 01.09.2011