2012-06-15 58 views
0

我正在使用带有键/值格式的表的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; 
} 

} 

回答

0

虽然我不是这方面的专家,但让我试着帮助你。

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

我希望它有帮助。

+0

但上述工作,商务部还表示,该辅助数据库“总是与一个主数据库相关联。”如果没有主数据库与其关联,则无法打开辅助数据库。我有一个主数据库和一个辅助数据库。 – ms1013

+0

@Matt - 再次阅读答案。注意它说“一个或多个”。你的评论意味着你误以为“不止一个”。文档似乎在说的是,如果您使用辅助数据库,则不能有重复项。 –

0

需要辅助数据库,需要需要以允许重复。如果

secondKey.setData(data.getData()); 

改为

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