I would just create a new QueryParser for each query. Allocating short-lived objects is just about free in java, and the time spent performing the actual search will by far dominate any time spent constructing QueryParser objects.
On 8/24/05, Vanlerberghe, Luc <[EMAIL PROTECTED]> wrote: > Thanks for pointing that out! > I checked the source and QueryParser is indeed not thread-safe (the > presence of local variables like jj_lastpos that are used *during* the > parsing makes this obvious) > > Perhaps it should be explicitly mentioned in the javadoc. > > The solution I'll probably go for is using ThreadLocal variables > (available since jdk 1.2, but there was a problem in the sun jvm with > deallocation when threads stop until jdk 1.4 or so) > > an example (not compiled, nor tested): > > public class MyQueryFactory { > public Query createQuery(String expression) { > return threadLocalQueryParser.get().parse(expression); > } > > private ThreadLocal<QueryParser> threadLocalQueryParser=new > ThreadLocal<QueryParser>() { > protected QueryParser initialValue() { > return new QueryParser("defaultField", new MyAnalyzer()); > } > }; > } > > (I used jdk 1.5 generics because the code is clearer, remove the > <QueryParser> and put a few casts where needed if you want this in 1.4 > or lower) > > initialValue() will be only be called once for every thread that calls > threadLocalQueryParser.get(). > > See the javadoc for java.lang.ThreadLocal > > Luc > > > -----Original Message----- > From: jian chen [mailto:[EMAIL PROTECTED] > Sent: dinsdag 23 augustus 2005 21:38 > To: java-user@lucene.apache.org > Subject: Re: QueryParser not thread-safe > > Right. My philosophy is that, make it work, then, make it better. > > Don't waste time on something that you are not sure if it would cause > performance problem. > > Jian > > On 8/23/05, Paul Elschot <[EMAIL PROTECTED]> wrote: > > On Tuesday 23 August 2005 19:01, Miles Barr wrote: > > > On Tue, 2005-08-23 at 13:47 -0300, [EMAIL PROTECTED] wrote: > > > > Hi! I've been having problems with lucene's QueryParser, > apparently it is > > not thread-safe. > > > > > > > > That means I can't parse queries in threads where the queryparser > object > > is created once and reused for each query. If I do, the resulting > queries may > > have all kinds of weird problems, for example missing terms, duplicate > terms, > > etc. > > > > > > > > I don't like the idea of creating a new queryparser for each > query, so I > > am looking for alternatives. Any ideas? > > > > > > Using a non-threadsafe object in a threaded environment is fairly > > > standard in Java, just wrap it in a synchronized block. > > > > > > If you don't want all threads waiting on one query parser, create a > pool > > > of them. > > > > Or use one parser per thread. > > > > Regards, > > Paul Elschot > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]