16

dynamic-insert/dynamic-updateをNHibernateに使用しない理由はありますか?私が尋ねる唯一の理由は、それが私が構成しなければならないものとしてではなく、デフォルトとして有効にしたいもののように思われるということです。

これらの動的プロパティを使用するときに注意すべき落とし穴はありますか?

4

2 に答える 2

35

一部のエンティティでは、動的更新によって無効な状態が作成される場合があります。プロパティと論理的に依存するプロパティをClass持つがあるとしましょう。プロパティが、の場合、プロパティは負の数のみになりますが、プロパティがの場合、プロパティは正の数になります。BooleanAIntegerBATrueBAFalseB

2人のユーザーが両方とも指定された期間内にこのクラスのインスタンスと対話するとします。まず、ユーザーのアリスとボブの両方がデータベースからこのクラスを実体化し、初期値はA=TrueとB=-50です。

Database   Alice       Bob
A: True    A: True     A: True
B: -50     B: -50      B: -50
VALID      VALID       VALID

ユーザーAliceは125に変更AFalse、データベースにコミットします。B今、私たちはこの状況にあります:

Database   Alice       Bob
A: False   A: False    A: True
B: 125     B: 125      B: -50
VALID      VALID       VALID

ユーザーBobは変更しませんが、 -75にA変更してから、データベースにコミットします。B動的更新がオンの場合、NHibernateはBobがB-75にのみ変更されたことを確認し、の値のみを編集する動的更新を発行しますB。サーバーでSQL検証を行って、 trueでBない限りネガティブAにならないようにした場合、ここでSQLエラーが発生しますが、SQLテーブルにすべてのビジネスロジックを再現していないとします。結果のデータは次のとおりです。

Database   Alice       Bob
A: False   A: False    A: True
B: -75     B: 125      B: -75
INVALID    VALID       VALID

アリスとボブの両方に有効な状態がありますが、データベースは無効な状態になっています。ユーザーCharlieがやって来て、このレコードを具体化しようとします。

Database   Alice       Bob       Charlie
A: False   A: False    A: True   A: False
B: -75     B: 125      B: -75    B: -75 
INVALID    VALID       VALID     INVALID

NHibernateがクラスの新しいインスタンスのBプロパティを設定しようとすると、Charlieはアプリケーションから検証エラーを受け取る可能性があります。

したがって、論理的に依存するプロパティがある場合は、この状況を回避するための戦略を立てる必要があります。select-before-update1つの可能性は、このエンティティを単に有効にすることです。これにより、追加のデータベース呼び出しが発生し、パフォーマンスが少し低下する可能性があります。もう1つは、NHibernateでバージョニングを利用することです。これは、Bobがレコードを保存しようとしたときに、NHibernateの挿入クエリが書き込みをトリガーせず、古いデータ例外(正常に処理できる)をスローしないことを意味します。データベース内のクラスの論理要件を体系化することもできますが、データベースとプログラムの両方が時間の経過とともに同じ体系化された要件を持っていることを確認するように注意する必要があります。要件が変更されたときに変更を加えますが、これは必ずしも価値のあるオーバーヘッドではありません。

つまり、多くの場合、開発者は動的更新の詳細を慎重に処理する必要があります。そのため、デフォルトではオンになりません。オンにするときは、エンティティの部分的な更新によって問題が発生する可能性があるかどうかを検討し、発生する場合は、その問題から保護するために推奨されている緩和戦略の1つを使用してください。

于 2012-12-19T15:11:08.513 に答える
6

NHibernateはSQLをキャッシュするのではなく毎回構築する必要があるため、動的な挿入と更新にはわずかなパフォーマンスコストがかかります。データベース側にコストがかかるかどうかはわかりません。動的な挿入と更新は、トラブルシューティングとプロファイリングに非常に便利です。意味のあるパフォーマンスヒットを測定できた場合は、開発時にオンにし、本番環境でオフにします。

リスナーとインターセプターで問題が発生する可能性があります。この質問を参照してください。

NHibernateアプリケーションで問題なくオンになっています。私の答えはノーです、それを使わない正当な理由はありません。

于 2012-12-19T15:38:30.690 に答える