4

nHibernate は手動で変更されたデータをリポジトリ テーブルから取得できませんか? 2 次キャッシュも無効にしましたが、(nhibernate) がキャッシュから取得したり、リポジトリ テーブルから取得したりしているようです。

4

7 に答える 7

6

nhibernate には、セッション キャッシュと二次キャッシュの 2 種類のキャッシュがあります。セッション キャッシュは、そのセッションで見られるオブジェクトを常にキャッシュしています。これは、どのオブジェクトが変更され、永続化する必要があるかを nhibernate が認識する方法です。無効にした第 2 レベルのキャッシュは、その下にあります。キャッシュされている情報は、セッション キャッシュからのものです。

アプリケーションが他のソースによって永続化された変更 (たとえば、手動のデータベース変更) を確認する必要がある場合、答えはおそらく、より細かい粒度でセッションを作成することです。SessionFactory はアプリケーションの存続期間中存続しますが、Session オブジェクトはより頻繁に作成する必要があります。たとえば、Web アプリケーションでは、すべての要求が独自のセッションを生成します。

それができない場合、session.Clear() はセッションからすべてのオブジェクトを削除します。

于 2008-10-02T03:15:11.193 に答える
2

NHibernate との良好な関係は、常に強力な OO のコミットメントに依存し、ほとんどの場合、データ変更の排他性に依存します。それを持っていない場合、いくつかの厄介な問題が発生し、NH が提供できる本当に優れた機能のほとんどを放棄することになります。

列「Id」と「SomeProperty」を持つテーブル「Foo」にマップされた「Foo」というクラスがあるとします。すべての行の「SomeProperty」が手動で「oldValue」から「newValue」に更新され、NH がクエリを DB に送信して、SomeProperty = 「newValue」であるすべての Foo を要求すると、DB は期待どおりにすべての Foo を返します。ただし、返された Id を持つ Foo は既にセッションにアタッチされている (つまり、第 1 レベルのキャッシュにあった) ため、NH が配信する Foo インスタンスには "oldValue" が含まれる場合があります。

NHibernate にすべての手動更新を認識させる唯一の簡単な方法は、StatelessSesion を使用することです。これにより、オブジェクト インスタンスはキャッシュされず、常に DB バージョンのデータが配信されます。しかし、これをトランザクション システムに適用する場合は、NH の不適切な使用の明確な兆候であり、優れた NH 機能のほとんどを取得できません。

于 2010-11-24T02:47:55.177 に答える
1

問題が解決するかどうかはわかりませんが、ドキュメントには次のように記載されています。

セッション キャッシュからすべてのオブジェクトを完全に削除するには、ISession.Clear() を呼び出します。

第 2 レベルのキャッシュの場合、インスタンス、クラス全体、コレクション インスタンス、またはコレクション ロール全体のキャッシュされた状態を削除するために、ISessionFactory で定義されたメソッドがあります。

帯域外で変更される可能性が高いデータに対して SELECT を実行する何かを行うたびにこれを行った場合は、必要なことが行われるはずです。

于 2008-09-26T12:45:49.063 に答える
0

私は実際に NHibernate のキャッシュ機能を実際に使用したことはありませんが、その意図は、データベースにアクセスする必要性をまったく排除することであると考えています。彼ら。

ここで何を達成しようとしているのか正確に質問したいのですが、データベースを手動で編集してテストを行っているだけですか、それともライブアプリケーションでの通常のアクティビティですか? 実際、データベースを変更する必要があるのはアプリケーションだけであり、NHibernate データ層を介して変更を行うため、その過程でキャッシュを更新および/またはダーティにします。

于 2008-09-25T14:15:49.893 に答える
0

具体的すぎてごめんなさい

Nhibernate は問題なくデータを取得しています。しかし、リポジトリテーブルのデータを手動で変更すると. Icriterea(nhibernate) がキャッシュまたはテーブルからピックアップされることがあります。私は Icriteria 関数を使用しています:

ICriteria 基準 = session.CreateCriteria(typeof(xyzclass)); criteria.Add(Expression.Eq("xyzclass", somestringto retreivedata)); 基準.SetCacheable(false); 条件を返します。UniqueResult();

于 2008-09-25T14:11:10.717 に答える
0

これはテストのほんの一部です。

しかし、将来的にはデータテーブルを手動で編集できます。また、そのテーブルの lazy を false に設定し、休止状態で使用されるすべての第 2 レベルのキャッシュ プロパティをコメントアウトしました。しかし、それでも、新しく編集された値ではなく、別の値が返されます。古い価値を与えてくれることもあれば、新しい価値を与えてくれることもあるので、一定ではありません。

于 2008-09-25T15:03:33.010 に答える
0

答えを得るには、正確な問題をもう少し説明する必要があると思います。私は nhibernate について最小限の経験しかありませんが、実際に何が起こっているのかを再現して、たとえばコードなしで修正しようとすることはできません。

于 2008-09-25T03:50:20.757 に答える