使用BerkeleyDB替换java.util.List

时间:2011-09-01 11:51:14

标签: java berkeley-db

是否有人可能有示例代码如何用BerkeleyDB中的类似内容替换java List(LinkedList或ArrayList)?我的问题是我必须更换列表以超出主内存限制。一些简单的示例代码非常好。

我现在使用了一个简单的TupleBinding for 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;本地类不兼容:stream classdesc serialVersionUID = 8484615870884317488,本地类serialVersionUID = -8805161170968505227

我正在使用的listener和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);
    }
}

我不知道为什么它不起作用: - /

编辑:抱歉,我只需要删除生成的环境/数据库并创建一个新的环境/数据库。

2 个答案:

答案 0 :(得分:2)

我害怕,它不会那么简单。您可能想要采取的第一步是重构代码以将对列表的所有访问移动到单独的类中(如果您愿意,可将其称为DAO)。然后,移动到数据库而不是列表会更容易。

答案 1 :(得分:2)

Berkeley DB对此类任务严重过度杀戮。配置和设置是一个公平的野兽,而且我相信许可证现已商业化。使用磁盘支持的列表或映射会更好。作为后者的一个例子,请看Kyoto Cabinet。它非常快,实现了标准的Java Collections接口,并且像List或Map一样易于使用。请参阅我的其他answer代码。