使用BerkeleyDB替换java.util.List

使用BerkeleyDB替换java.util.List,java,berkeley-db,Java,Berkeley Db,是否有人可能有示例代码,可以用类似的东西替换BerkeleyDB中的java列表(LinkedList或ArrayList)?我的问题是,我必须替换列表以扩展到超出主内存限制的范围。一些简单的示例代码会非常好 我现在对整数(键)使用了简单的元组绑定,对Diff类(数据值)使用了串行绑定 现在我收到了错误: 14:03:29.287 [pool-5-thread-1] ERROR o.t.g.view.model.TraverseCompareTree - org.treetank.diff.Di

是否有人可能有示例代码,可以用类似的东西替换BerkeleyDB中的java列表(LinkedList或ArrayList)?我的问题是,我必须替换列表以扩展到超出主内存限制的范围。一些简单的示例代码会非常好

我现在对整数(键)使用了简单的元组绑定,对Diff类(数据值)使用了串行绑定

现在我收到了错误:

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=-88051170968505227

我正在使用的侦听器和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);
    }
}
/**{@inheritDoc}*/
@凌驾
public void diffListener(最终EDiff参数diff,最终IStructuralItem参数newnode,
最终IsStructuralItem参数节点,最终DiffDepth参数深度){
试一试{
run(新填充的数据库(mDiffDatabase,mKey++,newdiff(paramDiff,paramNewNode.getNodeKey(),paramOldNode.getNodeKey(),paramDepth));
}捕获(最终异常e){
LOGWRAPPER.error(e.getMessage(),e);
}
}
私有静态类PopulatedDatabase实现TransactionWorker{
私人储存地图;
私人英特姆基;
私人差异价值;
公共填充数据库(final DiffDatabase paramDatabase、final int paramKey、final Diff paramValue){
对象。requirennull(参数数据库);
对象。requireNonNull(参数值);
mMap=paramDatabase.getMap();
mKey=paramKey;
M值=参数值;
}
@凌驾
public void doWork()引发DatabaseException{
mMap.put(mKey,mValue);
}
}
我不知道为什么它不起作用:-/


编辑:对不起,我刚刚不得不删除生成的环境/数据库并创建一个新的。

恐怕不会那么简单。您可能希望采取的第一步是重构代码,将对列表的所有访问移到一个单独的类中(如果愿意,可以称之为DAO)。这样,移动到数据库而不是列表就容易多了。

恐怕不会那么简单。您可能希望采取的第一步是重构代码,将对列表的所有访问移到一个单独的类中(如果愿意,可以称之为DAO)。这样,移动到数据库而不是列表就容易多了。

对于这种类型的任务,Berkeley DB的杀伤力太大了。这是一个公平的野兽配置和设置,而且我相信该许可证现在是商业化的。使用磁盘备份的列表或映射会更好。作为后者的一个例子,请看一看。它非常快,实现了标准的Java集合接口,并且与列表或映射一样易于使用。请参阅我的另一个示例代码。

对于这种类型的任务,Berkeley DB严重过度杀戮。这是一个公平的野兽配置和设置,而且我相信该许可证现在是商业化的。使用磁盘备份的列表或映射会更好。作为后者的一个例子,请看一看。它非常快,实现了标准的Java集合接口,并且与列表或映射一样易于使用。参见我的另一个示例代码。

我假设我必须存储简单的数字(0到List.size())作为键,然后使用数据库抽象来获取实际数据,这完全取决于您的数据。如果数据有其他固有结构,创建更合适的数据库布局可能是有意义的。我假设我必须存储简单的数字(0到List.size())作为键,然后使用数据库抽象来获取实际数据,这完全取决于您的数据。如果数据具有其他固有结构,那么创建更合适的数据库布局可能是有意义的。