2

アプリケーションでキューとして機能する SQL サーバー テーブルを使用しています。SQL 依存関係を使用したクエリ通知を使用しています。特に、このブログ投稿で使用されている Jeremiah Gowdy の素晴らしい実装です。http://jgowdy.blogspot.com/2010/01/sqldependency-query-notification-with.html

これを Windows サービスに実装し、それを使用して SQL テーブル、つまりキューの変更を「リッスン」し、変更がある場合はキューの返された内容を処理します - 以下のコードを参照して、内容のデータセットを返しますストアド プロシージャ。

問題は、負荷が高い場合や一定期間が過ぎた場合、テーブルにレコードが存在する場合でも、変更が検出されなくなることです。サービスを再起動すると、変更が検出されます! テーブルを手動で更新して通知をトリガーしようとしましたが、役に立ちませんでした。ある時点で通知サービスが中断され、再登録に失敗したようですが、確信が持てません。

テーブル自体の変更を常に監視し、キューがスタックした場合はサービスを再起動する必要があるため、この問題の解決策を必死に見つけようとしています-理想的ではありません!

他の誰かが SQL 依存関係とクエリ通知で問題を抱えていますか? 特に、既知の問題に関するガイダンスや知識が役立ちます。より良いキューイングシステムが存在することは知っていますが、プロジェクト全体を再開発するのではなく、できればこの問題を解決しようとしています!!!

コードスニペットを次に示します。

//Initialisation
public void StartWatcher()
{
    SqlCommand cmd = new SqlCommand();
    cmd = new SqlCommand("TransferExportQueue");
    cmd.CommandType = System.Data.CommandType.StoredProcedure;

    log.Info("Setting up SQL Watcher");
    //Setup the SQLWatcher
    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
    builder.ConnectionString = ConfigurationManager.ConnectionStrings["Connexion"].ConnectionString;

    log.Info("Attempting to Start");
    SqlQueueWatcher = new SqlWatcher(builder.ConnectionString, cmd, SqlWatcher.SqlWatcherNotificationType.Blocking);
    SqlQueueWatcher.OnChange += new SqlWatcher.SqlWatcherEventHandler(QueueSQLWatcher_OnChange);
    SqlQueueWatcher.Start();

}

//OnChangeEvent
private void QueueSQLWatcher_OnChange(DataSet Result)
{
    //perform logic in returned contents of stored procedure
}

ここに私のストアドプロシージャがあります

Create PROCEDURE [dbo].[TransferExportQueue] 
AS
BEGIN

SELECT [Id]
      ,[TransactionLogId]
      ,[QueueDate]
      ,[UpdateTable]
FROM [dbo].[TransferExportQueue]



END

更新: SQL サーバーのログがあり、次のエラーが発生しています。

The query notification dialog on conversation handle '{9586CB6A-62BA-E311-983B-A0369F0A65D3}.' closed due to the following error: '<?xml version="1.0"?><Error xmlns="http://schemas.microsoft.com/SQL/ServiceBroker/Error"><Code>-8470</Code><Description>Remote service has been dropped.</Description></Error>'.

さらに掘り下げた後、リモートサービスがドロップし続けているようです.SQLDependencyが呼び出しのたびにサブスクリプションをクリーンアップする方法に関係しているようです. この問題を解決する方法を知っている人はいますか?

4

1 に答える 1

3

この記事を読んでください: SqlDependency.OnChange コールバックのタイミング。その要点は、アプリが OnChange コールバックを処理するための時間が限られていることです。そうしないと、アクティブ化されたプロシージャ タイマーが起動してサービスを停止し、アプリに大混乱をもたらします。個人的にはデザインのファンではありませんが、そのままです。

SqlDependencyジャストインタイムで展開されるインフラストラクチャである便利な使用法を放棄しSqlNotificationRequest、ターゲット サービス/キューを明示的に展開する必要がある、より基本的なクラスを使用しなければならなかった人々のクラブへようこそ。使いやすさで失ったものは、動作を制御できるようになり、実行中のアプリケーションの下からターゲット サービスを削除することになった場合、少なくとも自分のせいにするだけです ;)

真剣に、SqlDependency から SqlNotificationRequest への切り替えはかなり簡単なので、お勧めします。

于 2014-04-02T12:59:33.197 に答える