Trouble with Berkeley DB JE API Base de bases de données secondaires et Sequences
-
21-09-2019 - |
Question
J'ai un document de classe qui se compose de Id (int)
et Url (String)
. Je voudrais avoir un index primaire sur Id
et l'indice secondaire sur Url
. Je voudrais également avoir une séquence pour l'identification automatique incrémentation. Je crée donc un SecondaryDatabase puis-je créer une séquence. Lors de l'initialisation de la séquence que je reçois une exception:
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)
Il semble que, pendant l'initialisation de la séquence de la base de données secondaire est obligé de mettre à jour. Lorsque je déboguer la méthode entryToObject de MyDocumentBiding les octets qu'il tente de convertir en objet semble aléatoire.
Qu'est-ce que je fais mal?
La solution
Je trouve que la solution consiste à créer un db séparé pour la séquence ou de faire le SecondaryKeyCreator détecter quand il ajoute une donnée de séquence et return false dans une telle situation.