0

キー/値形式のテーブルで Oracle Berkeley DB Java Edition を使用しています。重複したキーを挿入しようとしていますが、SecondaryIntegrityException が引き続き発生します。Oracle によると、setSortedDuplicates() が true に設定されている場合、重複が許可されます。私の場合、これは機能しません。以下は、key=bob、value=smith のコードです。最初に実行すると、期待どおりに実行されます。value=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;
}

}
4

2 に答える 2

0

セカンダリ データベースが必要であり、重複を許可する必要があります。上記は次の場合に機能します

secondKey.setData(data.getData());

に変更されます

secondKey.setData(((String)record.getobjectVal()).getBytes());
于 2012-06-16T17:47:48.537 に答える
0

私はこのトピックの専門家ではありませんが、お役に立てれば幸いです。

Oracle のドキュメントによると、「プライマリ データベースを 1 つ以上のセカンダリ データベースに関連付ける場合、重複するように構成されていない可能性があります」。このデータベースからの関連付けはありますか? もしそうなら、これが理由かもしれません。

お役に立てば幸いです。

于 2012-06-15T23:57:09.300 に答える