You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@lucene.apache.org by Jacob Rhoden <jr...@unimelb.edu.au> on 2009/11/11 01:23:54 UTC

Multiple threads under tomcat

Apologies if this info is already somewhere, but google cant find it  
(: I am assuming the following code is completely thread safe:



// Called from a servlet when a user action results in the index  
needing to be updated
public static void rebuildIndex() {
	FSDirectory dir = new NIOFSDirectory(new  
File(Configuration.getAttachmentFolder()), null);
	IndexWriter w = new IndexWriter(dir, analyzer,  
IndexWriter.MaxFieldLength.UNLIMITED);
	.... build index ...
	w.optimize();
	w.commit();
	w.close();
}

The following code is called from the search servlet:

// Called by the search servlet
public void search() {
	FSDirectory dir = new NIOFSDirectory(new  
File(Configuration.getAttachmentFolder()), null);
	IndexReader indexReader = IndexReader.open(dir,true);
	IndexSearcher searcher = new IndexSearcher(indexReader);
	.... do the search ...
}

I am trying to work out the best/correct way to improve upon this:

1) Should the "FSDirectory dir" object be shared as some sort of  
static variable?
2) Should the "IndexSearcher searcher" or the "IndexReader  
indexReader" objects be stored as a static variable, and then simply  
replaced when the index is rebuilt?


Thanks,
Jacob

____________________________________
Information Technology Services,
The University of Melbourne

Email: jrhoden@unimelb.edu.au
Phone: +61 3 8344 2884
Mobile: +61 4 1095 7575


Re: Multiple threads under tomcat

Posted by Erick Erickson <er...@gmail.com>.
1) Should the "FSDirectory dir" object be shared as some sort of static
variable?
I don't think it matters, do the simplest thing. The overhead in creating an
FSDirectory is so small in relation to the other operations that I don't
think you'd ever notice.

2) Should the "IndexSearcher searcher" or the "IndexReader indexReader"
objects be stored as a static variable, and then simply replaced when the
index is rebuilt?

Absolutely. Opening a searcher is expensive and they should only be opened
when necessary. However, if you have multiple threads using the same
searcher, you cannot close that searcher until all the threads are done with
their current search. There's an example of this in Lucene In Action II,
available from Manning in PDF format (it's still undergoing final editing).

Best
Erick


On Tue, Nov 10, 2009 at 7:23 PM, Jacob Rhoden <jr...@unimelb.edu.au>wrote:

> Apologies if this info is already somewhere, but google cant find it (: I
> am assuming the following code is completely thread safe:
>
>
>
> // Called from a servlet when a user action results in the index needing to
> be updated
> public static void rebuildIndex() {
>        FSDirectory dir = new NIOFSDirectory(new
> File(Configuration.getAttachmentFolder()), null);
>        IndexWriter w = new IndexWriter(dir, analyzer,
> IndexWriter.MaxFieldLength.UNLIMITED);
>        .... build index ...
>        w.optimize();
>        w.commit();
>        w.close();
> }
>
> The following code is called from the search servlet:
>
> // Called by the search servlet
> public void search() {
>        FSDirectory dir = new NIOFSDirectory(new
> File(Configuration.getAttachmentFolder()), null);
>        IndexReader indexReader = IndexReader.open(dir,true);
>        IndexSearcher searcher = new IndexSearcher(indexReader);
>        .... do the search ...
> }
>
> I am trying to work out the best/correct way to improve upon this:
>
> 1) Should the "FSDirectory dir" object be shared as some sort of static
> variable?
> 2) Should the "IndexSearcher searcher" or the "IndexReader indexReader"
> objects be stored as a static variable, and then simply replaced when the
> index is rebuilt?
>
>
> Thanks,
> Jacob
>
> ____________________________________
> Information Technology Services,
> The University of Melbourne
>
> Email: jrhoden@unimelb.edu.au
> Phone: +61 3 8344 2884
> Mobile: +61 4 1095 7575
>
>