2012-01-08 13 views
3

JPAの仕組みを理解しようとしています。私が知っていることから、エンティティを永続化すると、そのオブジェクトはアプリケーションが閉じられるまでメモリに残ります。つまり、以前に保持されたエンティティを検索すると、データベースに対してクエリが実行されません。挿入、更新、または削除が行われないと仮定すると、アプリケーションの実行時間が十分に長い場合、その中のすべての情報が永続的になる可能性があります。これは、ある時点でデータベースがもう必要なくなるということですか?エンティティはどれくらい時間をかけていますか?

編集

私の問題は、データベースとではありません。私は、アプリケーションの外部からデータベースを変更できないと確信しています。私は自分でトランザクションを管理しているので、データはコミットするとすぐにデータベースに格納されます。私の質問は、私がコミットした後、エンティティはどうなりますか?彼らは記憶に残っていて、キャッシュのように働いていますか?もしそうなら、彼らはそこにどれくらい長く保管されていますか? persistをコミットした後、selectというクエリを作成します。この選択は、前に永続化したオブジェクトを返す必要があります。そのオブジェクトはメモリから取り込まれるのだろうか、あるいはアプリケーションがデータベースに問い合わせるだろうか?

答えて

3

JPAは、永続コンテキスト(L1キャッシュ)または明示的キャッシュ(L2キャッシュ)のみでは動作しません。常にデータソースと結合する必要があります。このデータソースは、通常、安定したストレージに持続するデータベースを指しています。

したがって、JPA永続操作に必要なトランザクションがコミットされていない限り、エンティティはメモリー内に存在します。その後、データソースに送信されます。

トランザクションマネージャがトランザクションスコープ(「通常」の場合)の場合、L1キャッシュ(永続コンテキスト)は閉じられ、エンティティはそこに存在しなくなります。L1キャッシュが何とかあなたを悩ませるなら、それを明示的に少し管理することができます。それをクリアする操作があり、(トランザクションを必要としない)読み取り操作と書き込み操作を分けることができます。読み取り中にトランザクションがアクティブでない場合、永続コンテキストは存在せず、エンティティは接続されず、このL1キャッシュには入れられません。

しかし、L2キャッシュは、トランザクションがコミットされ、その内部のエンティティがアプリケーション全体で利用可能なままになってもクリアされません。このL2キャッシュは明示的に構成する必要があります。アプリケーション開発者は、キャッシュするエンティティを指定する必要があります。ベンダー固有のメカニズム(JBoss Cache、Infinispanなど)を介して、キャッシュされるエンティティの数に最大値を設定し、いわゆるエビクションポリシーを設定/定義できます。

もちろん、データソースが埋め込みDB内にポイントすることを妨げるものはありませんが、これはJPAの知識の範囲外です。

+0

私はデータベースを削除するつもりはありませんでした。私は_after_ aがすべてのエンティティをメモリに残し、キャッシュのように動作するかどうかを理解しようとしています。私は非常に頻繁にいくつかの情報が必要です。だから私は毎回データベースに照会したくないのです。リストはアプリケーション自体に冗長性を作成しますか? – Dragos

+1

毎回クエリを作成したくない場合は、L2キャッシュとオプションでクエリキャッシュを構成できます。まれな状況では、拡張永続コンテキストを利用することもできます。このコンテキストでは、アプリケーションが指定された期間L1キャッシュを開いたままにしますが、これは難しいのでL2を先に試してください。 –

5

それについて考える。

あなたのアプリケーションは、データベースを使用する唯一のものではないでしょう。あるエンティティが一度永続化されてメモリに格納されている場合、1時間後に他の手段で変更されないことをどのように確認できますか?このようなことが起こると、アプリケーションのロジックに害を及ぼす可能性のある古いデータが残ってしまいます。

メモリにデータを格納し、すべてが問題なく動作することを期待しても、何のメリットもありません。そのため、データベースに格納されたデータが主要な情報源です。データのサブセットが変更されないことが絶対に確実でない限り、毎回そのデータを照会する必要があります。

+0

私が編集したものを見てください。 – Dragos

3

持続性とは、アプリケーションをシャットダウンすることができ、データが失われないことを意味します。

これを実現するには、アプリケーションをシャットダウンしたときに失われない方法でデータベースや何らかの種類のデータを保存する必要があります。

4

エンティティをエンティティに永続化させると、エンティティはエンティティを第1レベルのキャッシュ(これはメモリ内)のように機能する永続コンテキストに追加します。実際の永続化が発生する場合は、コンテナ管理のトランザクションを使用するか、トランザクションを自分で処理するかによって異なります。エンティティインスタンスは、トランザクションがコミットされていない限りメモリに保存され、データベースやXMLなどに永続化されます。

+1

したがって、トランザクションの後、すべてのオブジェクトが削除され、データベース内のデータだけが残っていますか? – Dragos

+2

はい、それはほぼ正しいです。しかし、entitymanagerで永続化したエンティティ・オブジェクトへの参照がまだ残っている場合でも、メモリに保持されます。しかし、トランザクションが終了すると、それ以上の状態の同期化はデータベースに反映されません。 – Andreas

3

エンティティを実際にデータベースに保存することを意味します。 。確かに、JPAは永続コンテキスト内のいくつかのエンティティ情報をメモリに保持しています(これは構成とプログラミングの方法に大きく依存します)が、特定のポイント情報はデータベースに格納されます。必ずしもそうではない)。flush()またはmerge()操作の後。

3

コミット後にエンティティを保持したい場合や、選択クエリでエンティティを保持する場合は、クエリキャッシュを使用する必要があります。その言葉の周りのGoogleだけで、それはあなたには明らかです。

関連する問題