Повторяющиеся ключи в Oracle Berkeley DB Java Edition

Я использую Oracle Berkeley DB Java Edition с таблицами, имеющими формат ключ/значение. Я пытаюсь вставить повторяющиеся ключи, но продолжаю получать SecondaryIntegrityException. Согласно Oracle, если для setSortedDuplicates() установлено значение true, дубликаты разрешены. Это не работает в моем случае. Ниже приведен код с key=bob, value=smith. Первый раз запускаю, работает как положено. Если я запущу его во второй раз, изменив только значение = 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;
}

}

person ms1013    schedule 15.06.2012    source источник


Ответы (2)


Хоть я и не эксперт в этой теме, позвольте мне вам помочь.

Согласно документации Oracle, «если первичная база данных должна быть связана с одной или несколькими вторичными базами данных, она не может быть настроена для дубликатов». У вас есть ассоциация с этой базой данных? Если да, то это может быть причиной.

Я надеюсь, что это помогает.

person rlinden    schedule 15.06.2012
comment
Однако в документе также говорится, что база данных-получатель всегда связана с одной базой данных-источником. Нельзя открыть вторичную базу данных, если с ней не связана первичная база данных. У меня есть одна первичная и одна вторичная база данных. - person ms1013; 16.06.2012
comment
@Matt - прочитай ответ еще раз. Обратите внимание, что это говорит об одном или нескольких. Ваш комментарий подразумевает, что вы неправильно поняли это как более одного. Документация, кажется, говорит о том, что вы НЕ МОЖЕТЕ иметь дубликаты, если используете вторичную базу данных. - person Stephen C; 16.06.2012

Дополнительная база данных необходима и требуется для разрешения дубликатов. Вышеупомянутое работает, если

secondKey.setData(data.getData());

меняется на

secondKey.setData(((String)record.getobjectVal()).getBytes());
person ms1013    schedule 16.06.2012