0

CLR ストアド プロシージャ内で Solrnet を使用したことのある人はいますか? いくつかの優れたチュートリアルへのポインタをいただければ幸いです。

私が直面している問題の 1 つは、SolrNet ライブラリを VS (2008) データベース (SQL Server) プロジェクトへの参照として含める方法が見つからないことです。

アップデート:

したがって、SQL Server プロジェクトがあり、ライブラリへの参照を追加したい場合は、最初に SQL Server 自体に存在する必要があるようです。これは理にかなっています。これは、次の SQL を使用して DLL 自体から SQL Server でアセンブリを作成することによって行われます。

CREATE ASSEMBLY SolrNet FROM 'C:\CLR_SP\SolrNet.dll' 
WITH   PERMISSION_SET = UNSAFE

UNSAFEはデータベースのセキュリティに影響を与える可能性があることに注意してください。ただし、今のところ問題ありません)

ただし、SolrNet.dll には、Castle.Windsor.dll (それ自体がSystem.Core.dllを必要とする) やNinject.dllなどの他のライブラリ依存関係が必要です。必要なバージョンのCastle.Windsor.dll (2.5.1.0) とSystem.Core.Dll (Windows の .Net フォルダーにありました) を見つけましたが、必要なバージョンのNinject.dll (これは2.1.0.76 である必要があります)。アセンブリ バージョン 2.2 を作成しようとしましたが、期待どおりに機能しませんでした。

さまざまなリポジトリで検索しましたが、見つかりませんでした。このバージョンの DLL がどこにあるか知っている人はいますか?

更新 2:

そのため、ネット上で多くの検索を行った後、まだNinject.dll v2.1.0.76を見つけることができませんでした。私の次の試みは、SolrNet の次のバージョン (v0.4.0.2002) を使用することでした。このバージョンには、既に見つけたNinject.dll v2.2が必要でした。したがって、私の現在のステータスは、 SolrNet.dllの依存関係である SQL Server の他のすべてのライブラリを登録しています。同じ問題を抱えている人がいる場合に備えて、これを開いたままにしてプロセスを文書化します.

更新 3:

必要なすべてのライブラリを登録することができました (一部はGitHubの SolrNet ソースから取得しました)。これで、SolrNet がアセンブリとして SQL Server に登録されたので、(CLR ストアド プロシージャを作成するために) .NET SQL Server プロジェクトから参照できます。そこで、SOLR に接続してデータを取得する非常に単純な CLR SP を作成しました。以下のコード:

[Microsoft.SqlServer.Server.SqlProcedure]
public static void PrintToday()
{
    SqlPipe p;
    p = SqlContext.Pipe;
    p.Send("Helloooo");

    // Open Solr instance
    SolrNet.Startup.Init<ActiveProduct>("http://192.168.2.190:8983/solr");

    // Get instance of ActiveProduct
    ISolrOperations<ActiveProduct> operations = ActiveProduct.GetActiveProductSolrOperations();

    // Prepare QueryOptions. This will be passed as a parameter into the query() method.
    SolrNet.Commands.Parameters.QueryOptions qo = new QueryOptions();

    qo.Start = 0;
    qo.Rows = 20;

    // Query Solr
    SolrQueryResults<ActiveProduct> results = operations.Query(new SolrQueryByField("SearchDescription", "pants"), qo);

    // Read results
    String s = "Docs found: " + results.NumFound;
    p.Send(s);
}

次の問題は、CLR SP をデプロイして実行すると、Solr が既にコンテナーに登録されているというエラーが表示されることです。SQL Server Management Studio で表示される正確な出力は次のとおりです。

Helloooo
Msg 6522, Level 16, State 1, Procedure PrintToday, Line 0
A .NET Framework error occurred during execution of user defined routine or aggregate 'PrintToday': 
System.ApplicationException: Key 'SolrNet.Impl.SolrConnection.CLRStoredProcedures2.ActiveProduct.SolrNet.Impl.SolrConnection' already registered in container
System.ApplicationException: 
   at SolrNet.Utils.Container.Register(String key, Type serviceType, Converter`2 factory)
   at SolrNet.Utils.Container.Register[T](String key, Converter`2 factory)
   at SolrNet.Startup.Init[T](ISolrConnection connection)
   at SolrNet.Startup.Init[T](String serverURL)
   at StoredProcedures.PrintToday()

PrintTodayは CLR StoredProcedure の名前です

CLRStoredProcedures2は、.NET SQL Server プロジェクトの名前であり、VS 2008 の既定の名前空間です。

ActiveProductは、Solr でのドキュメントの名前であり、Solr 注釈を含む cs クラスです。

出力からわかるように、最初Pipe.send("Hellooo")はその仕事をしているため、SP はそこまで正常に動作します。

上記のエラーを検索したところ、同じアプリケーションで Solr インスタンスを 2 回登録しようとすると表示されることがわかりました。インスタンスを 2 回登録している場所がわかりません。ここで何か不足していますか?

上記の cs 関数は、私のマシンで開発された cs コンソール アプリケーションで実行すると正常に機能したことに注意してください。重要なもう 1 つの詳細は、SQL Server 2005 と同じネットワーク上にある私のマシンで SOLR サーバーがホストされていることです。

更新 4:

まず、上記のエラー (アップデート 3) は、SP が展開直後に初めて実行されたときに発生しません (現在修正に取り組んでいる別のエラーがあるため、最初の時間が機能すると仮定しましょう) )、その後 SP が再度実行されると、エラーが発生します。したがってSolrNet.Startup.Init<ActiveProduct>("http://192.168.2.190:8983/solr");、SPから呼び出されたときに何をしていても(私が思うにコンテナに関係するある種のセッションを作成しています)、「セッション」を解放していないため、2回目(およびその後の毎回)SPが実行されます、エラーが発生します。セッションを停止したり、コンテナから解放したりする方法はありますか。回避策としてできることはtry - catch一部SolrNet.Startup.Initですが、これはきれいではありません。

ありがとう。

4

1 に答える 1

0

可能な限り、手順/要件を説明付きで要約しようとします。

  • 何らかの理由で、SQL Server は、マージされた SolrNet の「隠された」依存関係をトリガーするようです。通常は、マージされた SolrNet (すべての統合モジュールを含む) を使用するだけでよく、統合クラスを無視すると、依存関係はトリガーされません。ただし、この場合、マージされていない SolrNet が必要です。
  • SolrNet は Solr サーバーに対して HTTP 要求を行うため、SQL-CLR でDLL をUNSAFE権限で登録する必要があります。
  • SolrNet の初期化 (Startup.Init) は、アプリケーションごとに 1 回だけ行う必要がありますが、SQL-CLR にこの初期化を配置するための「ルート」コンテキストがありません。回避策は、シングルトンまたはLazy タイプを使用することです。SQL-CLR はまだ .NET 4 を実行していませんが、Lazy 型をバックポートするか、FSharp.Core.dll の実装を使用することができます (これについては以前ブログに書きました) 。
于 2012-01-23T16:31:32.540 に答える