You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xindice-users@xml.apache.org by christophe reiss <ch...@free.fr> on 2004/04/30 09:30:06 UTC
problem with collection creation and index creation in the same run (embed)
Hi all (sorry if you receive this message for the second time, it is still not
in archives ???!!!),
I have an issue regarding collection creation and index creation within a same
run, using
embedded mode. I provide the code of a simple app that points the issue.
I use build 1.1b4, and the issue is present both on Linux and Windows XP with
java 1.4.2_03
The application opens an embedded database, then creates a collection at root
level, then
creates an indexer in this newly created collection, then exits.
The first time I launch the app (run 0), traces are :
...
xindice logs
...
xmldb:xindice-embed:///db/exampleColl is not defined, creating it !!!
...
xindice logs
...
creating indexer toto
...
xindice logs
...
After execution, in . db is present, as well as db/exampleColl, and toto.idx
is actually created in db/exampleColl
When I restart the application (run 1), traces are :
...
xindice logs
...
creating indexer toto
...
xindice logs
...
Thus, in run 1, indexer has been re-created... Is this expected ??????
When I restart application (run 2), traces are :
...
xindice logs
...
indexer toto is already present
...
xindice logs
...
which is correct.
Thus, in this case I need 2 runs to ensure that indexer is actually created...
What worries me is that I'm not sure that, if in run0 I add documents in
collection and index them with the index, those information will be actually
recorded in database.
Note that, if I comment the index creation in run 0, I only create the
collection.
If I remove the comment for run 1, the indexer is created, and in run 2 the
application detects the newly created index correctly.
There seems to be something with index creation flush, or am I missing
something ?
thanks for your support,
Christophe.
package xindicex;
import org.xmldb.api.*;
import org.xmldb.api.base.*;
import org.xmldb.common.*;
import org.xmldb.xupdate.*;
import org.apache.xindice.client.xmldb.embed.DatabaseImpl;
import org.apache.xindice.client.xmldb.services.CollectionManager;
import org.apache.xindice.xml.dom.DOMParser;
import org.apache.xindice.util.*;
import org.apache.xindice.xml.dom.DocumentImpl;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.util.Hashtable;
import java.util.Enumeration;
public class example {
public static void main(String[] argv) {
// Simple app : creates an embedded database or retrieves it, creates
// a "exampleColl" collection at root level or retrieves it if it is
already present,
// creates an indexer "toto" in "exampleColl" or retrieves it if it is
already present.
Collection colroot = null;
Collection coll = null;
Database db;
try {
String driver = "org.apache.xindice.client.xmldb.embed.DatabaseImpl";
Class c = null;
c = Class.forName(driver);
db = (Database) c.newInstance();
//use default system.xml...
DatabaseManager.registerDatabase(db);
String uri = "xmldb:xindice-embed:///db/";
colroot = DatabaseManager.getCollection(uri);
// create or retrieve exampleColl
String curr = uri + "exampleColl" + "/";
coll = DatabaseManager.getCollection(curr);
if (coll == null) {
System.out.println(curr + " is not defined, creating it !!!");
CollectionManager service =
(CollectionManager) colroot.getService("CollectionManager", "1.0");
// Build up the Collection XML configuration.
String collectionConfig =
"<collection compressed=\"true\" " +
" name=\"" + "exampleColl" + "\">" +
" <filer class=\"org.apache.xindice.core.filer.BTreeFiler\"/>" +
"</collection>";
coll = service.createCollection("exampleColl",
DOMParser.toDocument(
collectionConfig));
}
// create or retrieve indexer toto
CollectionManager cm = (CollectionManager) coll.getService(
"CollectionManager", "1.0");
// check if indexer exists
String[] idxrs = cm.listIndexers();
for (int i = 0; i < idxrs.length; i++) {
if (idxrs[i].equals("toto")) {
System.out.println("indexer toto already present ");
return;
}
}
System.out.println("creating indexer toto ");
Document doc = new DocumentImpl();
Element elt = doc.createElement("index");
elt.setAttribute("class", "org.apache.xindice.core.indexer.NameIndexer");
elt.setAttribute("name", "toto");
elt.setAttribute("pattern", "titi");
doc.appendChild(elt);
cm.createIndexer(doc);
}
catch (XindiceException ex) {
System.out.println("init error : " + ex.getMessage());
}
catch (IllegalAccessException ex) {
System.out.println("init error : " + ex.getMessage());
}
catch (InstantiationException ex) {
System.out.println("init error : " + ex.getMessage());
}
catch (XMLDBException ex) {
System.out.println("init error : " + ex.getMessage());
}
catch (ClassNotFoundException ex) {
System.out.println("init error : " + ex.getMessage());
}
finally {
if (coll != null) {
try {
coll.close();
}
catch (XMLDBException ex1) {
}
}
if (colroot != null) {
try {
colroot.close();
}
catch (XMLDBException ex2) {
}
}
}
}
}
close vs. shutdown (was: AW: problem with collection creation and index creation in the same run (embed))
Posted by Torsten Steinert <To...@web.de>.
Hi,
> > I think problem is that you forgot to shutdown database, so some files
> > are not written to the disk after first run. Also, index population is
> > performed asynchronously, so you need to give it some time to index
> > documents, and only then shutdown the database.
> >
> > Vadim
What is the difference between close() and shutdown() regarding consequences
(like flush all buffers, write all files etc.) The javadoc documentation
says nothing about the consequences.
If I only use close() on a collection, can I safely end my application or is
it absolutely necessary to call shutdown() on each open database instance?
Thanks,
Torsten
Re: problem with collection creation and index creation in the same run (embed)
Posted by christophe reiss <ch...@free.fr>.
>
> I think problem is that you forgot to shutdown database, so some files
> are not written to the disk after first run. Also, index population is
> performed asynchronously, so you need to give it some time to index
> documents, and only then shutdown the database.
>
> Vadim
Hi,
I tried to shutdown it by calling DatabaseInstanceManager.shutdown() on the
DatabaseInstanceManager casted from the CollectionManager of the root
collection without success.
I also tried to shutdown each collections the same way without success, and
forced the flushConfig() on the org.apache.xindice.core.Database... still no
success...
Christophe
Re: problem with collection creation and index creation in the same
run (embed)
Posted by Vadim Gritsenko <va...@reverycodes.com>.
christophe reiss wrote:
>I have an issue regarding collection creation and index creation within a same
>run, using embedded mode.
>
I think problem is that you forgot to shutdown database, so some files
are not written to the disk after first run. Also, index population is
performed asynchronously, so you need to give it some time to index
documents, and only then shutdown the database.
Vadim