我正在使用带有键/值格式的表的Oracle Berkeley DB Java版。我试图插入重复键,但不断得到SecondaryIntegrityException。根据Oracle的说法,如果setSortedDuplicates()设置为true,则允许重复。这在我的情况下不起作用。以下是key = bob,value = smith的一些代码。我第一次运行它,它按预期运行。如果我再次运行它只更改值= johnson,我得到SecondaryIntegrityException。有什么我做错了吗?谢谢。Oracle Berkeley DB Java版中的重复键
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;
}
}
但上述工作,商务部还表示,该辅助数据库“总是与一个主数据库相关联。”如果没有主数据库与其关联,则无法打开辅助数据库。我有一个主数据库和一个辅助数据库。 – ms1013
@Matt - 再次阅读答案。注意它说“一个或多个”。你的评论意味着你误以为“不止一个”。文档似乎在说的是,如果您使用辅助数据库,则不能有重复项。 –