我有一个简单的lucene索引搜索器,它是由一夜之间的工作构建的。这被新索引替换(通过覆盖现有索引),这个交换时间大约是一分钟。 (复制时间)
lucene搜索在WCF服务中,它使用structuremap来引导服务。 我尝试在下面使用这种方法。 1)我已经注册了索引a this.ForRequestedType() .AddConcreteType()AsSingletons();
但是,使用这种方法,indexsearcher在LuceneRepository中定义如下:
_searcher = new IndexSearcher(ObjectFactory.GetNamedInstance
(“LuceneVendorAliasDirectory”),true);
永远不会释放,而indexwriter(在索引作业中)无法交换索引。
2)我必须使用以下方法为每个WCF调用创建实例 this.ForRequestedType() .AddConcreteType() .LifecycleIs(new StructureMapOperationContextLifecycle());
这对于每个WCF调用意味着什么,它创建lucene存储库的新实例,如果50个客户端同时调用该服务,则500k的数据不是一个好的解决方案。
- 我想为我的第一种方法获得一些帮助。 拥有lucene存储库的单一实例并将其更新的最佳实践是什么?
我们没有任何维护窗口,因此服务无法停止。
答案 0 :(得分:1)
IndexSearcher的(ObjectFactory.GetNamedInstance (“LuceneVendorAliasDirectory”),true);听起来像是一个非常不稳定的解决方案。如果您想避免停机,您应该将索引复制到新位置并在完成后指向它。否则,当它处于不一致状态时可能会被读取。
我认为您需要让您的wcf应用程序知道索引何时被换出,然后您可以执行以下操作:
ObjectFactory.Configure(c => c.ForRequestedType<IndexSearcher>()
.Singleton().TheDefault.Is
.Object(new IndexSearcher(
ObjectFactory.GetNamedInstance("LuceneVendorAliasDirectory"), true)));
这将用新的实例替换当前实例,但在将来的请求中将其重新用作单例。
PS - 看起来你正在使用旧版本的StructureMap,所以我的语法可能有些偏差。