2011-04-02 15 views
5

Kullanıcıların bir Lucene dizinine sorgu gönderdiği bir web uygulamasına sahibim. sorguları bir Lucene QueryParser tarafından ayrıştırılır. QueryParser'un iş parçacığı güvenli olmadığını çok zor öğrendim.Birden çok iş parçacığında Lucene QueryParser: her seferinde yeni veya eşitlensin mi?

Tek bir QueryParser örneğini kullanmak ve çağrıları parse() yöntemiyle senkronize etmek daha iyi midir? Veya her sorgu için yeni bir örnek oluşturmak daha mı iyi? (Ya ben daha iyi QueryParser s'lik bir havuz kenarında servis olurdu?) Böyle Genel sorular özel hususlar bağlıdır ve profil gerektiren, ama belki birilerinin QueryParser s/oldukça ucuz olan "kesin söyleyebiliriz biliyoruz

inşa etmek pahalı?

cevap

6

Her defasında yeni bir tane oluşturun. Bunlar hafif nesnelerdir ve JVM nesne oluşturma ve çöp toplama işlemlerini çok iyi bir şekilde gerçekleştirir. Kesinlikle bir nesne havuzu kullanmayın.

+0

+1 Evet, kesinlikle QueryParser' nesnesini havuzlamak (veya paylaşmak) için bir neden yok. Daha fazla okuma: [Java teori ve pratiği: Kentsel performans efsaneleri, yeniden ziyaret edildi] (http://www.ibm.com/developerworks/java/library/j-jtp09275/index.html) – WhiteFang34

+0

Teşekkürler! @ WhiteFang34, bu bağlantı, genel olarak tahsis maliyetinin düşük olmasıyla ilgilidir, fakat **, ** inşaatın ucuz olmadığı bazı tip nesneler olduğuna işaret etmeye değerdir. Çünkü çok fazla iş, tahsisin ötesinde yapılır. Lucene dünyasında, çoğu zaman performans nedenleriyle tek bir 'IndexSearcher' paylaşması hatırlatılır. –

İlgili konular