2012-06-15 61 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());