問題タブ [nhibernate-caches]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
3175 参照

nhibernate - nhibernate.caches.syscache 3.1 はどこでダウンロードできますか

私はインターネットを調べてきましたが、NHibernate 3.1.0.4000 で動作する nhibernate.caches.syscache の v3.1 をダウンロードできる場所が見つからないようです。

syscache のバージョンは 3.0.0.4000 ですが、新しいバージョンはありますか?

0 投票する
0 に答える
300 参照

fluent-nhibernate - マルチユーザー環境でのNHibernate QueryCache

私たちの Web アプリケーション (ASP.NET) では、Fluent NHibernate (2.1.2) を使用して、エンティティだけでなく、クエリ (基準 API を使用してクエリを生成する) に対しても第 2 レベルのキャッシュを使用しています。Session-Per-Request パターンと 1 つの SessionFactory アプリケーション全体を使用しているため、キャッシュはすべての Nhibernate-Sessions を提供します。


問題:

従来のデータベース (Oracle) のデータ オブジェクトでは、ユーザーごとに異なる "アクセス権" に対処する必要があります。つまり、ビューはユーザー権限ごとに返されるデータを制限します。したがって、たとえば、まったく同じクエリを使用して基準によって同じビューがクエリされますが、ユーザー権限に応じて異なる結果セットが返されるという状況があります。

ここで、パフォーマンスを向上させるために、前述のクエリがキャッシュされます。しかし、これはユーザー A のアクションからクエリが最初に起動されたときに、ユーザー A がアクセス権を持つ ID である結果の ID をキャッシュするという問題を引き起こします。その直後に、同じクエリがユーザー B のアクションから起動され、Nhibernate は (ユーザー A からの) 最初の呼び出しからキャッシュされた ID を選択し、ユーザー B がアクセス権を持っていない対応するエンティティを取得しようとします (または、すべてではないかもしれません)。イベントリスナーで権利をチェックしているため、前述のケースではアプリケーションがアクセス権例外をスローします。


考え:

クエリをキャッシュしないことは、これに対するオプションになる可能性があります。しかし、パフォーマンスは明らかに私たちのアプリケーションの問題であるため、ユーザーごとにクエリをキャッシュすることが本当に望ましいでしょう。

ユーザーごとに SessionFactory を作成して、ユーザーごとにキャッシュを作成することも考えました。しかし、これは明らかにリソースに影響を与え、やややり過ぎであり、正直なところオプションではありません。複数のユーザー (ユーザー グループを考えてください) がアクセスし、操作する必要があるエンティティが存在するためです。 「個々のキャッシュ」などの古いデータに関する問題。だから、それはいけません。

これに対する有効な解決策は何ですか?そのような状況の「ベストプラクティス」のようなものはありますか?


考え:

昨日これに行き詰まり、解決策が見つからなかったので、寝て、今日、ある種の「ハック」を思いつきました。

NHibernate はクエリ テキストとパラメータ (「句」) によってクエリをキャッシュするため、クエリの署名でユーザーに依存するものを「密輸」する方法を考えました。これにより、ユーザーごとにすべてのクエリがキャッシュされますが、クエリ自体を変更します (クエリの結果に関して)。

したがって、「創造性」が私をこれに導きました(サンプルコード):

この行:

.Add(Expression.Sql(string.Format("{0} = {0}", userName)))

これは常に true と評価されますが、Nhibernate の観点からクエリを「変更」するため、個別の「userName」ごとにキャッシュされます。

私は知っています、それはちょっと醜いです、そして私はそれに本当に満足していません. 誰かが別のアプローチを知っていますか?

前もって感謝します。

0 投票する
1 に答える
3423 参照

c# - インデックスが配列の範囲外でした - NHibernate 3.2

流暢な nhibernate 1.2 および NHibernate 3.1 を使用してプロジェクトを FNH 1.3 および NH 3.2 にアップグレードしようとしましたが、.List() コマンドで例外が発生することを除いて、すべて機能しているようです。

例外の種類とメッセージは... NHibernate.Exceptions.GenericADOException 検索を実行できません[SQL: SQL が利用できません] および内部例外です... System.IndexOutOfRangeException インデックスが配列の範囲外でした。

SQL Server でクエリをプロファイリングしましたが、NH によって生成されたクエリは問題ないため、AppFabric キャッシュと NH 3.2 に問題があると思います。

FNH と NH の参照だけを変更したコードはありません。

以下はC#での私のクエリです...

以下は、バージョン間で変更されていない FNH によって生成されたマッピング hbm です...

NH 3.2 ソースでは、次の行で例外がスローされます...

そしてコールスタック...

さらに詳しい情報が必要な場合は、お知らせください。

0 投票する
2 に答える
1413 参照

nhibernate - Hibernate の第 2 レベルのキャッシング - リージョンの削除

nHibernate 実装には、多数のキャッシュ領域が設定されています。負荷分散された Web サーバーでの問題を回避するために、キャッシュされたデータを編集するページのキャッシュを効果的に無効にしたいと考えています。すべてのクエリ キャッシュ、クラス キャッシュ、およびエンティティ キャッシュを簡単にクリアするメソッドを作成できます。

しかし、私が本当に望んでいるのは、地域ごとにキャッシュをクリアすることです。sessionFactory.EvictQueries() はリージョン パラメータを受け取りますが、Evict() と EvictCollection() は受け取りません。ここでキャッシュ全体を破棄したくはありませんし、タイプとキャッシュ領域を関連付けるある種のぎこちない辞書を維持したくもありません。nHibernate には、エンティティまたはコレクションにキャッシュ設定を尋ねる方法がありますか?

ありがとう

0 投票する
0 に答える
93 参照

nhibernate - NHibernate Cache PrevalenceProvider の奇妙な動作

私は NH Prevalence Cache プロバイダーを何年もの間幸せに使用していますが、最近、私のチームは、まだ説明できないデータの誤りに陥り始めました...

キャッシュ プロバイダーを設定し、prevalenceBase フォルダーを AppDomain.CurrentDomain.BaseDirectory に設定して、デフォルトの有効期限を 120 に設定することで、普及率を設定します。

マッピング内の各キャッシュ登録にはリージョン名があります

キャッシュは機能しているように見えますが、アプリケーションが再利用された場合、NHibernate によって返されるデータは有効な識別子ではなく、別のエンティティが所有していると思われるデータを提供します。フォルダー (AppDomain.CurrentDomain.BaseDirectory) 内の .snapshot ファイルを削除すると、問題が発生する次のリサイクルまで、すべてが正常に機能し始めます。

誰も同じ問題を抱えていますか?誰でもこの問題を解決できますか?

確かに私は何かを忘れたり無視したりしますが、有病率を設定する方法をよりよく説明できる人が大歓迎です よろしくお願いします

0 投票する
2 に答える
6010 参照

nhibernate - NHibernate> = 3.2でNHibernateの第2レベルキャッシュを構成するにはどうすればよいですか?

NHibernate 3.2にアップグレードする前に、FluentNHibernateに次のコードを使用しました。

ただし、.Cache()拡張メソッドはNHibernate3.2では見つかりません。

キャッシュプロバイダーを設定するにはどうすればよいですか?

編集:私も試しました:

0 投票する
2 に答える
1599 参照

hibernate - Hibernate HQL createQuery

SQLクエリを実行する古いアプリケーションを次のように古い方法で変換しようとしています。

上記のコードは約10ミリ秒かかります。これには、データベース接続の取得、ステートメントの作成、およびクエリの実行が含まれます。

私は現在HibenateHQLを使用しており、次のようなHQLクエリを作成しました。

現在、このステートメント「session.createQuery(....)」は約105ミリ秒かかります。これは、上記の古い方法でクエリ全体を実行する場合よりも約10倍長くなります。

Hibernateクエリキャッシングがどのように機能するかはよくわかりませんが、同じHQLステートメントを2回実行すると、約5ミリ秒かかります。

さて、私の質問は、なぜこの動作がHibernateHQLを使用して発生するのかということです。「session.createQuery(...)」メソッドの内部で何が起こっているのかを知っている人はいますか。最初の実行にははるかに時間がかかりますが、2回目の実行にははるかに時間がかかります。また、「query.list()」を実行するときに、Hibernateがデータベースに対してSQLを実行することにも気づきました。

ありがとう。

0 投票する
1 に答える
463 参照

ehcache - terracotta で hibernate 分散型 ehcache をセットアップする際のセッション ファクトリの問題

Terracotta を使用して分散環境で EHCache をセットアップしようとしています。ここで、アプリケーション サーバーと Terracotta サーバーを接続でき、Terracotta 開発者コンソールでレプリケートされたオブジェクトを表示できます。

ただし、アプリケーションサーバーでは、アプリケーションの残りの部分は適切に実行されていますが、継続的に次の例外メッセージが表示されます:

こんにちは、この例外メッセージが表示される理由と解決方法を教えていただける方がいらっしゃいましたら、よろしくお願いいたします。また、休止状態アプリケーション用にテラコッタをセットアップするための包括的なチュートリアルがあると助かります。

ここで [CacheByAmitNode8081] は、アプリケーション サーバーで定義したキャッシュ ノードの名前です。

0 投票する
1 に答える
17442 参照

java - JPA で Hibernate の二次キャッシュを使用するにはどうすればよいですか?

エンティティ属性値ベースの永続化メカニズムを実装しています。すべての DB アクセスは Hibernate 経由で行われます。ノードのパスを含むテーブルがあります。これは非常に単純で、ID とパス (文字列) だけです。パスの数は少なく、数千程度です。

メイン テーブルには何百万もの行があり、パスを繰り返すのではなく、独自のテーブルへのパスを正規化しました。以下は、メインテーブルに挿入するときに必要な動作です

1)パステーブルにパスが存在するかどうかを確認します(パス値をパラメーターとして使用して、エンティティマネージャーを介してクエリを実行します)

2) 存在しない場合は、ID を挿入して取得します (エンティティ マネージャーを介して永続化します)。

3) id を外部キー値としてメイン テーブルの行に配置し、これをメイン テーブルに挿入します。

これは、メイン テーブルと他のいくつかのテーブルの多数の行に対応する一連のドメイン オブジェクトに対して何千回も発生します。したがって、上記の手順は、次のような単一のトランザクションを使用して繰り返されます。

ステップ 2 を実行すると、操作全体のパフォーマンスが大幅に低下します。しばらくすると、そのテーブルは非常にまれな新しい挿入を含む最大 10 ~ 20k のエントリになるため、キャッシュが必要です。私はHibernateでこれをやろうとしましたが、ほぼ2日を失いました.

JPAアノテーションとECacheを備えたHibernate 4.1を使用しています。以下に示すように、挿入全体で同じクエリ オブジェクトを使用しても、クエリ キャッシュを有効にしようとしました。

NodePath エンティティには、次のように注釈が付けられます。

統計からわかる限り、クエリ キャッシュが使用されていますが、第 2 レベル キャッシュの使用は報告されていません。

単純な手書きのハッシュテーブルをキャッシュとして使用すると、期待どおりに動作し、合計時間が大幅に短縮されます。操作の性質上、Hibernate のキャッシュをトリガーできていないと思います。

このセットアップで休止状態の二次キャッシュを使用するにはどうすればよいですか? 記録のために、これは私の持続性 xml です。

http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0">

0 投票する
1 に答える
547 参照

hibernate - Hibernate4.1.xEhCacheはディスクに何も保存しません

Spring MVC3.1.xでHibernate4.1.1.Finalを使用しており、第1レベルと第2レベルの両方のキャッシュを使用しています。キャッシュ操作のアノテーションを使用してドメインオブジェクトを構成しました。ただし、キャッシュはディスクに何も保存しません。

これが私のehcache.xmlファイルです:

Hibernateキャッシュのプロパティ:

ドメインオブジェクトの匿名化ベースの構成:

/tmpフォルダーに**ehcacheという名前のフォルダーがありません:**

/tmpフォルダー