0

JPA (EclipseLink) の背後にあるデータベースでクエリ ロギングをオンにしたところ、JPA の「最適化」と「キャッシング」の恐ろしさを目の当たりにしました。

たとえば、次のような単純な JPA クエリを実行します。

 SELECT p FROM Picklist p;

... JPA はデータベースに対して何百万もの SQL クエリを実行します (レコードごとに 1 つのクエリなので、id=[...] のピックリストから * を選択します)。Picklist は単純なエンティティです。

SELECT * FROM Picklist を実行せず、他のすべて (永続コンテキストの入力など) をメモリ内で実行するのはなぜですか?

これを行うように指示するには、特別なスイッチが必要ですか? なぜこのように機能するのですか?

4

2 に答える 2

1

まず、JPAクエリを確認する必要があります

SELECT Picklist p FROM Picklist p; 

これはあるべきです

SELECT p FROM Picklist p; 

Select *次に、そのタイプのクエリを実行すると、列だけでなくより多くの情報が得られるため、を作成できないことを理解する必要があります。

3 番目に、Hibernate はクエリを各データベースに変換する必要があることを覚えておいてください。その機能を提供するには、Sql Native であるためパフォーマンスが低下する可能性がありますが、これは新しいバージョンごとに改善されています。レコードを完全に使用および処理できる通常の SQL クエリを使用します

于 2012-05-09T14:21:59.013 に答える
1

JPA にはさまざまなクエリ最適化手法が用意されていますが、これらのいずれも使用しないと、不要なクエリが発生する可能性があります。

Picklist の関係のクエリを見ていると思いますが、使用している正確なクエリ、Picklist のマッピング、および SQL が役立ちます。

関係を最適化する方法を確認するには

http://java-persistence-performance.blogspot.com/2010/08/batch-fetching-optimizing-object-graph.htmlを参照してください。

于 2012-05-09T14:44:47.737 に答える