2017-08-12 5 views
0

私はいくつかのデータを取得し、クエリに使用して、Solrで検索し、適切な結果を返すWebサービスを開発しています!それが正常に動作しますが、私はそれが一度だけこれまでのところ、私はこれを持っているのSolrを初期化する必要があります。WebサービスでSolr接続を認証する

private static bool initialized = false; 

    [WebMethod] 
    public XmlDocument getContributor(string name,string email) 
    { 
     if (!initialized) 
     { 
      Startup.Init<SolrSearchResult>("http://Host:44416/solr"); 
      initialized = true; 
     } 
     if (string.IsNullOrEmpty(email)) 
     { 
      return SolrSearchResult.SearchData(name); 
     } 
     return SolrSearchResult.SearchDataWithEmail(name, email); 
    } 

しかし、私は、複数のユーザーが使用しているときだと思う、それは動作しません!私はそれを修正するためにスマートな方法が必要です!私はどんな提案もありがとう!

P.S:SampleSolrAppを見ました。そこにはstartup.initがApplication_Startで使用されていますが、私はここで同等のものが何か分かりません。

+0

あなたの質問が並行性に関するものであれば、 'Init'への呼び出しの同期を考慮する必要があります。あなたは単純な 'ロック 'を使ってこれを行うことができます。 – Biscuits

+0

@ビスケットすみませんが、もう少し説明できますか?私はこれでまったく新しい! – saeedeh

答えて

1

getContributorメソッドに複数の同時呼び出しが行われたときに、Startup.Initが複数回呼び出されないようにする1つの方法は、相互排他ロックを導入してそのコードブロックへのアクセスを同期させることです。あなたのケースでは

、私が最初にロックする静的オブジェクトを導入することで起動します:

private static readonly object syncRoot = new object(); 

そして、ロックイン声明の中で、あなたのコードのその部分を囲みます。

lock (syncRoot) 
{ 
    // only 1 thread ever enters here at any time. 

    if (!initialized) 
    { 
     Startup.Init<SolrSearchResult>("http://Host:44416/solr"); 
     initialized = true; 
     // no more threads can ever enter here. 
    } 
} 

lockキーワードは、あるスレッドがクリティカルセクションに入っている間に他のスレッドがクリティカルセクションに入り込んでいないことを保証します。別のスレッドがロックされているコードブロックを入力しようとすると、オブジェクトが解放されるまで待機します。

サイドノートとして。

// check to see if its worth locking in the first place. 
if (!initialized) 
{ 
    lock (syncRoot) 
    { 
     // only 1 thread ever enters here at any time. 

     if (!initialized) 
     { 
      Startup.Init<SolrSearchResult>("http://Host:44416/solr"); 
      initialized = true; 
      // no more threads can ever enter here. 
     } 
    } 
} 

initializedが必要とされることはありません場合は、この作品:あなたは、このコードは、さらに、各時間getContributorが呼び出されるロックを取得するために小さなパフォーマンスコストを負う回避をロックがダブルチェックと呼ばれる最適化するのに使用できることはほとんど技術がありますfalseになり、何らかの理由で後で再度実行する必要はありません。Startup.Initそれ以外の場合、このコードをそのまま使用して問題に遭遇する可能性があります。

+0

助けてくれてありがとう! – saeedeh

関連する問題