【问题标题】:How do I reinitialize a singleton object on an interval如何在间隔内重新初始化单例对象
【发布时间】:2012-08-24 20:18:12
【问题描述】:

我正在设置一个托管 Lucene.Net / AzureDirectory 搜索引擎的 WCF Web 服务。

出于速度目的,使用AzureDirectory 的推荐方法是拥有一个可供所有服务调用使用的单例IndexSearcher 实例。这是我必须做的:

public class LuceneHelper
{    
    private static IndexSearcher _searcher;
    public static IndexSearcher searcher
    {
        get
        {
            if (_searcher == null)
                initSearcher();
            return _searcher;
        }
    }
    public static void initSearcher()
    {
        _searcher = new IndexSearcher(azureDirectory);
    }
    ...
}

由于该对象缓存了它正在搜索的索引,我需要在与任何客户端调用异步的时间间隔内重新初始化该对象......就像每分钟左右一样。所以我尝试在我的 azure 实例上的另一个线程中设置一个运行该进程的进程...

LuceneHelper.initSearcher();
while (true)
{
    Thread.Sleep(60000);
    LuceneHelper.initSearcher();
}

我可以从我的测试中看出它们都在工作,但彼此独立。所以我猜我的网络服务中有一个 IndexSearcher,我的工作线程中有一个。

我的问题:有没有办法在我的 web 服务中异步运行我的无限“while”语句,或者以任何其他方式在没有客户端调用的情况下重新初始化对象?

【问题讨论】:

  • 为什么需要每隔一段时间重新打开 IndexSearcher?看起来您想要使用 Lucene 进行近乎实时的搜索,blog.mikemccandless.com/2011/06/…
  • 通过提前初始化 IndexSearcher,它会缓存索引,这也是 Lucene.Net 如此快速的原因。我需要重新打开它的原因是刷新该缓存。

标签: .net web-services asynchronous singleton lucene.net


【解决方案1】:

回答您的直接问题,是的,可以让 while 语句在您的 Web 服务的后台运行。您所要做的就是创建一个Thread class 的实例并让它运行您的循环并将对它的引用存储在您的应用程序中(您的单例类将是一个好地方)。

也就是说,我不建议这样做,因为您不需要打开/关闭/重新打开 IndexSearcher class。推荐的做法是在您的应用程序的整个生命周期中维护一个共享的IndexWriter 实例,然后调用GetReader method 以按需获取IndexReader 实例(然后您可以从中创建一个IndexSearcher)。这通常比重新创建索引要快得多且更易于维护(而且它也是实时的,因为对 GetReader 的调用将对索引进行所有更改)。

【讨论】:

  • 将它与 IndexWriter.MergedSegmentWarmer 结合起来,您就可以为新创建的段执行自定义预热逻辑。
  • @simon-svensson 我无法找到如何使用 IndexWriter.SetMergedSegmentWarmer。您能否分享一个快速示例或操作方法链接?谢谢。
  • 嘿@SimonSvensson 我在将 IndexReaderWarmer 作为参数传递给 SetMergedSegmentWarmer 时遇到问题,因为 IndexReaderWarmer 是一个不可调用的抽象类。我能够从它继承并覆盖一些东西来让它工作。毕竟很明显,取暖器对我不是很有帮助,我可以通过调用 IndexWriter.GetReader() 或 ReOpen 来实现类似的效果。我可能会误解取暖器,但至少它有效。感谢您的跟进。
猜你喜欢
  • 2011-03-25
  • 2012-11-27
  • 2020-10-13
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2019-10-14
  • 2023-03-25
相关资源
最近更新 更多