私はNHibernateを初めて使用し、現在のWebサイトに設定するのに苦労しています。この Web サイトは、1 つのデータベース サーバーを備えた複数の Web サーバーで実行されるため、同時実行の問題に直面することになります。この Web サイトには推定 50,000 人ほどのユーザーが登録されており、各ユーザーにはプロフィール ページがあります。このページでは、Facebook と同じように、他のユーザーが別のユーザーを「いいね」することができます。これは、並行性の問題が発生した場合です。
複数の Web サーバーを使用するため、おそらく MemChached プロバイダーを使用して、2 番目のレベルのキャッシュを使用することを考えていました。NHibernate を使用してこのような「いいね」機能を実装する最良の方法は何ですか? 次の3つの選択肢を考えていました。
- シンプルな Count() クエリを使用します。テーブル「User_Likes」があり、各行はあるユーザーから別のユーザーへのいいね! を表します。いいねの数を表示するには、単純にデータベースに変換されるユーザーのいいねの数を尋ねます
SELECT COUNT(*) FROM USER_LIKES WHERE ID = x
。ただし、ユーザーがプロファイル ページにアクセスするたびに、別のユーザーと同様に、いいね! の数を再計算する必要があるため、これには大きなパフォーマンスの低下が伴うと思います。 - ユーザー テーブルで追加の
NumberOfLikes
列を使用し、ユーザーが別のユーザーを好きまたは嫌いなときにこの値を増減します。ただし、これにより同時実行の問題が発生します。単純な for ループを使用して、2 つのサーバーでユーザーを 1000 回いいねしてテストしたところ、データベースの結果は合計で約 1100 いいねでした。それは 900 の違いです。現実的なテストであろうとなかろうと、これはもちろんオプションではありません。さて、解決策として楽観的ロックと悲観的ロックを検討しました (そうですか?) が、現在のリポジトリ パターンは現時点ではこれを使用するのに適していないので、修正する前に知りたいと思います。これが正しい方法である場合。 - 2 と同様ですが、カスタム HQL を使用して update ステートメントを自分で記述し
UPDATE User SET NumberOfLikes = NumberOfLikes + 1 WHERE id = x
ます。これにより、データベースで同時実行の問題が発生することはありませんか? ただし、第 2 レベルのキャッシュが原因で、複数のサーバーでデータの不一致が発生するかどうかはわかりません。
だから...ここで本当にアドバイスが必要です。別のオプションはありますか?これは一般的な状況のように感じられ、確かに NHibernate はこれをエレガントな方法でサポートする必要があります。私はNHIbernateを初めて使用するので、明確で詳細な返信が必要であり、高く評価されています:-)ありがとう!