2011-08-14 11 views
0

カスケードの更新/削除(ユーザー、ユーザーの役割、ユーザーと役割の権限)をサポートする関連エンティティがあります。
アプリケーションサーバーは頻繁にそれを使用し、私はそれに高速アクセスを実装する必要があります。その目的のために、私はそれをアプリケーションキャッシュに入れます。
質問は、そのデータを介してカスケード操作を実行すると、DBとキャッシュの間の同期化を提供する方法ですか?たとえば、私はいくつかの役割を落とす場合、私はまた、すべての役割の権限を削除する必要がありますか私はすべての役割とその権限を削除する必要がありますユーザーをドロップします。
キャッシュ内の実際のデータをサポートするにはいくつかの方法がありますが、いくつかの欠点もあります。何が最善の解決策であるか教えてください。キャッシング関連のデータ

  1. すべてのカスケード操作は、トリガーを使用してデータベースで行われます。アプリケーションは、SqlCacheDependencyメカニズムを介して通知を受け取ります。問題:Whnサーバーの負荷が大きいのはどうですか?通知が遅れ、DB /アプリケーションサーバーが "select SomeField from DataTable where id = @x"のような多くの正確な依存関係に対応するにはコストがかかりますか?
  2. すべてのカスケード操作は、アプリケーションのビジネスレイヤーで行われます。すべてのDB更新/削除操作の後にキャッシュ無効化操作が続きます。問題:論理が2倍になり、ネットワークトラフィックが多い(代わりに多くの更新)
  3. DBでのカスケード操作、キャッシュでのカスケード無効化はCacheDependencyを使用します。問題:ロジックが2倍になりました。

良い解決策はありますか? ありがとうございました!

+0

2)すべてのカスケード操作はアプリケーションのビジネスレイヤーで行われます。>>私はデータアクセスレイヤーを意味します – Jim

+0

Entity Frameworkは自動的にカスケード変更を行うようにそのような機能を提供しますか? – sll

答えて

0

ORMの使用はどうですか?
私はcachingとカスケード内蔵されているので、あなたはそれを心配する必要はありません。

これ以外の場合は、アプリケーションロジックをストレージレイヤに導入するため、オプション#1または#3を使用しないでください。
オプション#2の賢明な実装 - アプリケーションがDBに削除コマンドを送信しても、パフォーマンスが低下してはいけません。

+0

お返事ありがとうございます。オプション#2では、関係するすべてのエンティティに対して、ネットワーク経由で多数の単一の更新/削除を実行する必要があります。それは良い考えだと思いますか? – Jim

+0

なぜすべての関連エンティティですか?ロールを削除する場合、クエリは 'delete from permissions where role_id = ... 'になります。これはただ一つのクエリです。とにかく、それがパフォーマンス上の問題であることを証明するまでは、それを1つのものとして扱うべきではありません。 *早期の最適化はすべての悪の根源です* http://c2.com/cgi/wiki?PrematureOptimization –

+0

私はあなたを持っています:)そう...私のRolePermissionエンティティは、DeleteとDeleteByRoleの両方のビジネスレイヤメソッドを持ちます。キャッシュエントリの値を格納します。右? – Jim

関連する問題