【问题标题】:Duplicate Keys in Oracle Berkeley DB Java EditionOracle Berkeley DB Java 版中的重复键
【发布时间】:2012-06-17 01:47:48
【问题描述】:

我正在使用带有键/值格式的表的 Oracle Berkeley DB Java 版。我正在尝试插入重复的键,但不断收到 SecondaryIntegrityException。根据 Oracle,如果 setSortedDuplicates() 设置为 true,则允许重复。这在我的情况下不起作用。下面是一些 key=bob, value=smith 的代码。我第一次运行它,它按预期运行。如果我第二次只更改 value=johnson 运行它,我会得到 SecondaryIntegrityException。有什么我做错了吗?谢谢。

String key = "bob";
String value = "smith";

EnvironmentConfig envConfig = new EnvironmentConfig();
envConfig.setAllowCreate(true);
envConfig.setTransactional(false);
Environment myDBenvironment = new Environment(new File(filePath), envConfig);


DatabaseConfig dbConfig = new DatabaseConfig();
dbConfig.setAllowCreate(true);
dbConfig.setTransactional(false);
Database myDatabase = myDBenvironment.openDatabase(null, dbname,
        dbConfig);

// create secondary database
SecondaryConfig mySecConfig = new SecondaryConfig();
mySecConfig.setAllowCreate(true);
mySecConfig.setSortedDuplicates(true);
mySecConfig.setTransactional(false);
mySecConfig.setKeyCreator(new SecondKeyCreator());
SecondaryDatabase mySecondaryDatabase = myDBenvironment
.openSecondaryDatabase(null, secdbname, myDatabase,
        mySecConfig);


DatabaseEntry myKey = new DatabaseEntry(key.getBytes("UTF-8"));

Record mydata = new Record();
mydata.setobjectVal(value);
DatabaseEntry myrecord = new DatabaseEntry();
new RecordTupleBinding().objectToEntry(mydata, myrecord);
myDatabase.put(null, myKey, myrecord);

mySecondaryDatabase.close();
myDatabase.close();
myDBenvironment.close();


public class SecondKeyCreator implements SecondaryKeyCreator{   

@Override
public boolean createSecondaryKey(SecondaryDatabase arg0,
        DatabaseEntry key, DatabaseEntry data, DatabaseEntry secondKey) {
    RecordTupleBinding binding = new RecordTupleBinding();
    Record record = (Record) binding.entryToObject(data);

    try {
        secondKey.setData(data.getData());
    } catch (Exception e) {
        e.printStackTrace();
    }

    return true;
}

}

【问题讨论】:

    标签: java database oracle berkeley-db-je


    【解决方案1】:

    虽然我不是该主题的专家,但让我尝试帮助您。

    根据 Oracle 文档,“如果一个主数据库要与一个或多个辅助数据库相关联,它可能不会被配置为重复”。你有来自这个数据库的关联吗?如果是这样,这可能是原因。

    希望对你有帮助。

    【讨论】:

    • 但是,文档还说辅助数据库“始终与单个主数据库关联”。如果没有主数据库与之关联,则无法打开辅助数据库。我有一个主数据库和一个辅助数据库。
    • @Matt - 再次阅读答案。请注意它说“一个或多个”。您的评论意味着您将其误读为“不止一个”。文档似乎在说的是,如果您使用的是辅助数据库,则不能有重复项。
    【解决方案2】:

    需要一个辅助数据库并且需要允许重复。如果

    secondKey.setData(data.getData());
    

    改为

    secondKey.setData(((String)record.getobjectVal()).getBytes());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多