0

これが私のシナリオです。サードパーティのシステム/データベースにレコードを挿入する夜間のバッチ ジョブがあります。これらのインポート呼び出しはすべて、私が作成したプロキシ サービスを介してルーティングされます。これは主に、ファイアウォールのために夜間のバッチ ジョブがサード パーティ サービスに直接接続されていないためです。

したがって、ジョブの実行ごとに 10000 レコードをインポートします。プロキシ サービスへの接続を確立します。プロキシ サービスは、サード パーティの Web サービスへの静的な参照/接続を確立します。現在 (笑わないでください)、プロキシ サービスで各レコードの接続を確立しています。つまり、この 1 つのジョブを実行するために、プロキシ サービスで 10000 回の「OpenConnection」および「CloseConnection」メソッド呼び出しが行われます。私はこの仕事を 1 日 2 回行っています。

私の質問は、最初の Web サービス呼び出しで接続を確立するが、その最初の呼び出しが行われたときに接続を閉じない場合、後続の Web サービス呼び出しは既存の接続を再利用しますか (静的であるため)? それとも、サードパーティ サービスで別のセッションを再作成しますか?

これが機能する場合 (後続の呼び出しのために接続を開いたままにする)、ジョブが完了したときに接続を閉じて、管理されている (または管理されていない) リソースを解放するにはどうすればよいですか? 「CloseConnection」という独自の Web サービスにメソッドを追加したくありません...

それに加えて、当社のサーバーは夜間に自動 IIS RESETS を実行しますが、その時点で接続がまだ開いている場合、接続は適切に破棄されますか?

申し訳ありませんが、このプロセスをスピードアップするという私のタスクを達成するための「ベストプラクティス」アプローチを探しているだけです。

これのコード例を示してみます。バッチ ジョブのコードは次のとおりです。

ws.EstablishConnection();

for (int counter = 0; counter < 10000; counter++)
{
   ws.ImportRecord(myRecords[counter]);
}

ws.Dispose();

Web サービス コード:

[WebMethod]
public static void ImportRecord(MyRecord myRecord)
{
   try
   {
      OpenConnection();
      _3rdPartyWS.ImportRecord(myRecord);
   }
   catch (Exception)
   {
      throw;
   }
   finally
   {
      CloseConnection();
   }
}
4

1 に答える 1

1

私の質問は、最初の Web サービス呼び出しで接続を確立するが、その最初の呼び出しが行われたときに接続を閉じない場合、後続の Web サービス呼び出しは既存の接続を再利用しますか (静的であるため)?

静的な場合は、同じオブジェクトが使用されます。しかし、速度はあまり上がりません。「開いている」接続がタイムアウトする可能性があるため、注意してください。

それとも、サードパーティ サービスで別のセッションを再作成しますか?

Web サービスは「セッションレス」であり、各呼び出しは独自のセッションになります。

これが機能する場合 (後続の呼び出しのために接続を開いたままにする)、ジョブが完了したときに接続を閉じて、管理されている (または管理されていない) リソースを解放するにはどうすればよいですか? 「CloseConnection」という独自の Web サービスにメソッドを追加したくありません...

あなたの接続オブジェクトは静的です...明示的に "closeConnection.

それに加えて、当社のサーバーは夜間に自動 IIS RESETS を実行しますが、その時点で接続がまだ開いている場合、接続は適切に破棄されますか?

「プール アイドル」タイムアウトは、毎晩のベース IISReset の前に経過する場合があります。ガベージ コレクターは、あなたの側で使用されているすべてのメモリを破棄します。サードパーティは close() リクエストを受信して​​いない可能性がありますが、しばらくすると確実に接続が閉じられます。

あなたのケースでできる最善のことは、MyReccord の配列を受け取る Web サービス メソッドを実装することです。そこで多くの時間を節約できます。

[WebMethod]
public static void ImportRecord(MyRecord[] myRecords)
{
   try
   {
      OpenConnection();
      for (int counter = 0; counter < myRecords.Length; counter++)
      {
         3rdPartyWS.ImportRecord(myRecords[counter]);
      }
   }
   finally
   {
      CloseConnection();
   }
}

可能であれば、オブジェクトの配列またはファイルを受け取る Web メソッドを実装するようサードパーティに依頼することをお勧めします。

Web サービスのループは非常に遅いため、これを行うべきではありません。

于 2013-02-21T16:20:40.120 に答える