2012-06-15 2 views
0

키/값 형식의 테이블이있는 Oracle Berkeley DB Java Edition을 사용하고 있습니다. 중복 키를 삽입하려고하지만 계속 SecondaryIntegrityException이 발생합니다. 오라클에 따르면 setSortedDuplicates()가 true로 설정되면 중복이 허용됩니다. 내 경우에는 작동하지 않습니다. 다음은 key = bob, value = smith가있는 코드입니다. 처음 나는 그것을 실행, 예상대로 실행됩니다. 만약 내가 값 = johnson 만 변경하면, SecondaryIntegrityException을 얻는다. 내가 뭘 잘못하고 있니? 감사.Oracle Berkeley DB Java Edition의 중복 키

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());