Probleme mit Berkeley DB JE Base-API Secondary Datenbanken und Sequenzen
-
21-09-2019 - |
Frage
ich eine Klasse Dokument haben, die von Id (int)
und Url (String)
besteht. Ich möchte einen Primärindex auf Id
und Sekundärindex auf Url
haben. Ich möchte auch eine Sequenz für Id Auto-Inkrementierung haben. Also habe ich eine SecondaryDatabase erstellen und dann erstelle ich eine Sequenz. Während der Initialisierung der Sequenz erhalte ich eine Ausnahme:
Exception in thread "main" java.lang.IllegalArgumentException
at com.sleepycat.util.UtfOps.getCharLength(UtfOps.java:137)
at com.sleepycat.util.UtfOps.bytesToString(UtfOps.java:259)
at com.sleepycat.bind.tuple.TupleInput.readString(TupleInput.java:152)
at pl.edu.mimuw.zbd.berkeley.zadanie.rozwiazanie.MyDocumentBiding.entryToObject(MyDocumentBiding.java:12)
at pl.edu.mimuw.zbd.berkeley.zadanie.rozwiazanie.MyDocumentBiding.entryToObject(MyDocumentBiding.java:1)
at com.sleepycat.bind.tuple.TupleBinding.entryToObject(TupleBinding.java:76)
at pl.edu.mimuw.zbd.berkeley.zadanie.rozwiazanie.UrlKeyCreator.createSecondaryKey(UrlKeyCreator.java:20)
at com.sleepycat.je.SecondaryDatabase.updateSecondary(SecondaryDatabase.java:835)
at com.sleepycat.je.SecondaryTrigger.databaseUpdated(SecondaryTrigger.java:42)
at com.sleepycat.je.Database.notifyTriggers(Database.java:2004)
at com.sleepycat.je.Cursor.putNotify(Cursor.java:1692)
at com.sleepycat.je.Cursor.putInternal(Cursor.java:1616)
at com.sleepycat.je.Cursor.putNoOverwrite(Cursor.java:663)
at com.sleepycat.je.Sequence.<init>(Sequence.java:188)
at com.sleepycat.je.Database.openSequence(Database.java:546)
at pl.edu.mimuw.zbd.berkeley.zadanie.rozwiazanie.MyFullTextSearchEngine.init(MyFullTextSearchEngine.java:131)
at pl.edu.mimuw.zbd.berkeley.zadanie.testy.MyFullTextSearchEngineTest.main(MyFullTextSearchEngineTest.java:18)
Es scheint, dass die sekundäre Datenbank während der Initialisierung der Sequenz zu aktualisieren gezwungen wird. Wenn ich die entryToObject Methode debuggen die Bytes von MyDocumentBiding, dass es zu Objekt zu konvertieren versucht scheint zufällig.
Was mache ich falsch?
Lösung
Ich fand heraus, dass die Lösung eine separate db für die Sequenz entweder zu erstellen oder die SecondaryKeyCreator erkennen zu machen, wenn es eine Sequenzdaten und return false in einer solchen Situation hinzuzufügen.