我们在Sitecore中搜索Lucene索引时遇到问题。一切都运行正常,然后,在看似随机的时间之后,我们开始在针对索引的每次搜索中得到以下错误:
System.ArgumentOutOfRangeException
Message: Non-negative number required.
Parameter name: capacity Source: mscorlib
at System.Collections.Hashtable..ctor(Int32 capacity, Single loadFactor)
at System.Collections.Hashtable.Clone()
at SupportClass.WeakHashTable.Clean()
at SupportClass.WeakHashTable.CleanIfNeeded()
at SupportClass.WeakHashTable.Add(Object key, Object value)
at Lucene.Net.Util.CloseableThreadLocal.Set(Object object)
at Lucene.Net.Index.TermInfosReader.GetThreadResources()
at Lucene.Net.Index.TermInfosReader.Get(Term term, Boolean useCache)
at Lucene.Net.Index.SegmentReader.DocFreq(Term t)
at Lucene.Net.Index.DirectoryReader.DocFreq(Term t)
at Lucene.Net.Search.Similarity.IdfExplain(Term term, Searcher searcher)
at Lucene.Net.Search.TermQuery.CreateWeight(Searcher searcher)
at Lucene.Net.Search.BooleanQuery.BooleanWeight..ctor(BooleanQuery enclosingInstance, Searcher searcher)
at Lucene.Net.Search.BooleanQuery.CreateWeight(Searcher searcher)
at Lucene.Net.Search.Query.Weight(Searcher searcher)
at Lucene.Net.Search.Hits..ctor(Searcher s, Query q, Filter f, Sort o)
at Lucene.Net.Search.Searcher.Search(Query query, Sort sort)
at scSearchContrib.Searcher.QueryRunner.RunQuery(Query query, Boolean showAllVersions, String sortField, Boolean reverse, Int32 start, Int32 end)
at scSearchContrib.Searcher.QueryRunner.GetItems(IEnumerable`1 parameters, Boolean showAllVersions, String sortField, Boolean reverse, Int32 start, Int32 end) at
查看被调用的.Net代码和Lucene.Net代码(通过ILSpy),我看不出这是如何实际发生的。在哈希表上调用.Clone()不应允许传递哈希表容量的负数。
在我们的服务器场中的多台服务器上已经多次发生这种情况,重新启动IIS可以解决问题。这让我相信存在某种内存中的腐败现象,但我不确定是什么原因造成这种情况或如何弄清楚发生了什么。
答案 0 :(得分:3)
Sitecore支持为Sitecore 6.6提供了解决方法。在Lucene.NET 2.9.4中使用的WeakHashTable类显然存在一些令人讨厌的线程安全问题。此问题在Lucene.NET的更高版本中以及Sitecore 7中的相应升级中得到解决。
答案 1 :(得分:1)
通过将以下设置添加到web.config
,尝试增加Sitecore的工作线程数<setting name="MaxWorkerThreads" value="100"/>