Hi Koji,
Thanks for your help, would not have found that soon ... You are right, if I
apply your code, the IOException comes.
I only see one difference in the constructor of the IndexWriter class:
"closeDir" is 'true' in my scenario and 'false' in your scenario. What is
reason for this difference? And if there is a valid reason, it might be
useful to add this to the javaDoc of the IndexWriter class.
See below the difference in the constructor:
When passing a Directory object:
public IndexWriter(Directory d, Analyzer a, boolean create)
throws IOException {
this(d, a, create, false);
}
When passing a String path:
public IndexWriter(String path, Analyzer a, boolean create)
throws IOException {
this(FSDirectory.getDirectory(path, create), a, create,
true);
}
Dick
On 1/10/06, Koji Sekiguchi <[EMAIL PROTECTED]> wrote:
>
> Hello Dick,
>
> Why you couldn't get an IOException when obtaining the second
> writer because you used IndexWriter(String,Analyzer,boolean) version
> constructor. Try IndexWriter(Directory,Analyzer,boolean) version instead:
>
> To do it, add the following code on your program:
>
> import org.apache.lucene.store.Directory;
> import org.apache.lucene.store.FSDirectory;
>
> private Directory directory;
>
> private Directory getDirectory() throws IOException {
> if( directory == null ){
> directory = FSDirectory.getDirectory( indexDir, true );
> }
> return directory;
> }
>
> And use the following method:
>
> private IndexWriter getWriter(String name, boolean createIndex)
> throws
> IOException
> {
> System.out.println("Opening writer " + name + " on: " +
> this.indexDir);
> //return new IndexWriter(this.indexDir, this.analyzer,
> createIndex);
> return new IndexWriter(getDirectory(), this.analyzer,
> createIndex);
> }
>
> If IndexWriter(path,Analyzer,true) is used,
> IndexWriter calls FSDirectory.getDirectory(path,true) and
> FSDirectory overwrites the existing lock file.
>
> Hope this helps,
>
> Koji
>
> > -----Original Message-----
> > From: Dick de Jong [mailto:[EMAIL PROTECTED]
> > Sent: Sunday, January 08, 2006 1:54 PM
> > To: [email protected]
> > Subject: Basic question on opening 2 IndexWriters on same
> > Directory - I do not get IOException ...
> >
> >
> > Question:
> > Run attached java class and see the also attached when I ran it.
> > I assumed the second writer should get an IOException in
> > getWriter (in
> > first TESTCASE).
> > However this does not happen! This only happens when I open both
> > writers with flag 'createIndex'=true (see
> > also second test case).
> >
> > Is this a misunderstanding from my side or what is this?
> >
> > ENVIRONMENT:
> > Windows Professional XP SP2
> > Lucene 1.4 (java)
> >
> >
> > OUTPUT OF MAIN METHOD:
> > =======================
> > START TESTCASE
> > Test open 2 index writers on index c:\temp\indexdir
> > writer 1 uses createIndex =true
> > writer 2 uses createIndex =true // why not an
> > IOException here ??
> > Opening writer w1 on: c:\temp\indexdir
> > Writing document to index using writer :w1
> > Opening writer w2 on: c:\temp\indexdir
> > Writing document to index using writer :w2
> > Writing document to index using writer :w1
> > Closing writer w1
> > Closing writer w2
> > END of test case ...
> > =======================
> > =======================
> > START TESTCASE
> > Test open 2 index writers on index c:\temp\indexdir
> > writer 1 uses createIndex =true
> > writer 2 uses createIndex =false
> > Opening writer w1 on: c:\temp\indexdir
> > Writing document to index using writer :w1
> > Opening writer w2 on: c:\temp\indexdir
> > In open writer caught IOException:
> > Lock obtain timed out:
> > [EMAIL PROTECTED]:\DOCUME~1\ddjong\LOCALS~1\Temp\lucene-
> > ea51d1f7bb672168eda3ee90698e936d-write.lock
> > Closing writer w1
> > END of test case ...
> > =======================
> >
> > USED JAVA class (src):
> > ==================================
> >
> > import java.io.IOException;
> >
> > import org.apache.lucene.analysis.Analyzer;
> > import org.apache.lucene.analysis.standard.StandardAnalyzer;
> > import org.apache.lucene.index.IndexWriter;
> > import org.apache.lucene.document.Document;
> > import org.apache.lucene.document.Field;
> >
> > public class TestIndexWriter
> > {
> >
> > private IndexWriter w1;
> > private IndexWriter w2;
> > private String indexDir;
> >
> > private Analyzer analyzer;
> > private Document document;
> >
> > private TestIndexWriter()
> > {
> > // just create dummy document for test purposes, document is
> > reused.
> > this.document = new Document();
> > this.document.add(Field.Keyword("fname", "fvalue"));
> >
> > // indexDirectory Folder to be used
> > this.indexDir = "c:\\temp\\indexdir";
> >
> > this.analyzer = new StandardAnalyzer();
> > }
> >
> > private IndexWriter getWriter(String name, boolean
> > createIndex) throws
> > IOException
> > {
> > System.out.println("Opening writer " + name + " on: " +
> > this.indexDir);
> > return new IndexWriter(this.indexDir, this.analyzer,
> > createIndex);
> > }
> >
> > private void closeWriter(String name, IndexWriter w)
> > {
> > try {
> > if (w != null) {
> > System.out.println("Closing writer " + name);
> > w.close();
> > }
> > }
> > catch (IOException e) {
> > System.out.println("Don't bubble error in close
> > writer; error:
> > \n" + e.getMessage());
> > }
> > }
> >
> > private void addDocument(String name, IndexWriter w) throws
> > IOException
> > {
> > System.out.println("Writing document to index using writer :" +
> > name);
> > w.addDocument(this.document);
> > }
> >
> >
> > public void testOpenIndexWriters(boolean w1_create, boolean
> > w2_create)
> > {
> > System.out.println("=======================");
> > System.out.println("START TESTCASE");
> > System.out.println("Test open 2 index writers on index " +
> > this.indexDir);
> >
> > System.out.println(" \twriter 1 uses createIndex =" +
> w1_create);
> > System.out.println(" \twriter 2 uses createIndex =" +
> w2_create);
> >
> > this.w1 = this.w2 = null;
> > try
> > {
> > w1 = this.getWriter("w1", w1_create);
> > addDocument("w1", w1);
> > w2 = this.getWriter("w2", w2_create);
> > addDocument("w2", w2);
> > addDocument("w1", w1);
> > }
> > catch (IOException e)
> > {
> > System.out.println("In open writer caught IOException:");
> > System.out.println("\t" + e.getMessage());
> > }
> > finally
> > {
> > this.closeWriter("w1", w1);
> > this.closeWriter("w2", w2);
> > System.out.println("END of test case ...");
> > System.out.println("=======================");
> > }
> > }
> >
> > public static void main(String[] args)
> > {
> > TestIndexWriter tw = new TestIndexWriter();
> > tw.testOpenIndexWriters(true, true);
> > tw.testOpenIndexWriters(true, false);
> > }
> > }
> >
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>