2013-10-04 12 views
7

私はデータを取得するために休止状態の基準APIを使用しています。これらのデータは、ユーザーが見ただけです。ユーザーはこれらのデータを変更できません。だから、readOnlyを使うことで何か利点はありますか?あなたはプロの&を提案することができますか?考慮すべき他の尺度はありますか?休止状態でreadOnlyを使用すると、パフォーマンス上の利点はありますか?

Read-only entities

+0

デタッチされたインスタンスまたは管理されたインスタンスについてお話ししていますか?階層化されたアーキテクチャのWebアプリケーションですか?ユーザーが、APIを使用してアプリケーションの通常の非技術的ユーザー(ビューレイヤとやりとりする)にアクセスする開発者を意味していますか? – Thihara

答えて

11

Hibernateは修正を見つけて、あなたはセッションをフラッシュしたときにすべての変更を永続化するために、セッション内でロードされたすべてのオブジェクトを追跡しています。エンティティを読み込み専用としてロードする場合、Hibernateにそのエンティティの変更をトレースさせないように指示します。このようにして、パフォーマンスが向上します。

ただし、オブジェクトはセッションキャッシュに残ります。キャッシュが大きすぎると、大きな問題となります。また、メモリ不足のリスクもあります。多くのオブジェクトを読んだら、それらを追い払うのは良いことです。

Hibernateのパフォーマンスが実際に問題になる場合は、純粋なJDBCに切り替えるほうが良い方法です。大量のデータをロードするためにHibernateを使用することは決してありません(レポートやバッチ処理など)。リストを表示するためには、エンティティ全体ではなく、必要なフィールドだけを読み込みます(選択したフィールドだけを読み込み、エンティティ全体ではなく、常に読み込み専用です)。

答えは、はいです。これにより、Hibernateは少し速くなりますが、さらにパフォーマンスを上げるための他の方法があります。

+0

必要なフィールドを持つリストを表示するために、hibernateを持つdbビューを使用しています。読み取り専用オブジェクトは常にキャッシュに残りますか?追い出されないのですか? – nayakam

2

読み取り専用エンティティを使用する方が、目的式の表現によく似ています。読み込み専用を使うことで、変更されてもエンティティが変更されたかどうかは確認されません。これは、変更に対して保護されているため、変更不可とマークされたエンティティとは異なります。 Hibernateは、不変のエンティティオブジェクトのプロパティが変更されたことを検出するとエラーになりますが、読み取り専用のエンティティは変更されません。

エンティティの読み取りのみを行うと、変更を永続させたくないという旨のハイバネーションが通知されます。関連するコレクションの場合には、これは当てはまらないかもしれません。

特殊な要件があるか、特別な高価な汚れチェックを行わない限り、パフォーマンスの向上は最小限に抑えられます。

パフォーマンスに関してではありません。これは、オブジェクトの意図しない変更からデータベースを保護するための安全対策です。

たとえば、地理的な場所を示すロケーションエンティティがあります。今、人がいて、それに場所を割り当てる。人物協会を使用して場所を読み込むときは、場所を読み取り専用にすることができます。また、同僚(またはあなた自身)が事故によって場所を誤って変更した場合でも場所を変更することができます。変更は保存されませんが、Personエンティティへの変更はそのまま残ります。 (場所を不変としてマークするのが最善かもしれませんが、まれなケースがありますが、これでは不十分です)

関連する問題