2012-05-09 11 views
0

JPA(EclipseLink)のデータベースでクエリのログを記録し、JPAの "最適化"と "キャッシュ"の恐怖を目の当たりにしました。このような単純なJPAクエリやっ例えばJPAクエリ "optimization"

、:

SELECT p FROM Picklist p; 

が...ピックリストから*そう選択し、JPAは、データベースへのSQLクエリの百万円(各レコードに対して1つのクエリを実行するようになりますここでid = [...])。そしてPicklistは簡単なエンティティです!

なぜSELECT * FROM Picklistを実行せず、メモリ内に(Persistance Contextなどを埋める)他の処理もしません。

これを行うには、特別なスイッチが必要ですか?なぜそれはこのように働いているのですか?

+1

はなぜピックリストPからPを選択されていない、

参照関係を最適化する方法を参照するには、 ?なし(ピックリストp) –

+0

入力ミス、修正。 – bozo

答えて

1

あなたは、あなたがそのタイプのクエリを実行するときので、あなたがSelect *を作ることができないことを理解する必要があり、これは

SELECT p FROM Picklist p; 

セカンドでなければなりませんJPAクエリ

SELECT Picklist p FROM Picklist p; 

をチェックする必要がまず列だけの情報をもっと持ってきてください。

第3に、Hibernateはクエリを各データベースに翻訳する必要があることを覚えておいてください。パフォーマンスが低下する可能性があります.Sql Nativeは新しいバージョンごとに改善されました。

0

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

使用している正確なクエリ、Picklistのマッピング、およびSQLが役立つが、Picklistの関係のクエリが表示されていると仮定します。

http://java-persistence-performance.blogspot.com/2010/08/batch-fetching-optimizing-object-graph.html

+0

たとえば、私は、CustomerTypeとindustryTypeのためのPicklistエンティティであるいくつかのフィールドを持つCustomerを持っています。今度はdaoPicklist.getByName( "partner")を5回呼び出してPicklistを取得し、それを既存のCustomerエンティティに割り当ててマージします。このdaoPicklist.getByName(...)は、Picklistを取得するために(コードの異なるモジュールで)何度も呼び出されます。しかし、私はデータベースクエリログを見て何が起こるのは、私はこのメソッドを呼び出すたびに、SQLクエリが実行されることです!したがって、キャッシングはまったくありません。 – bozo

+0

daoPicklist.getByName(...)は何をしますか? Id以外のクエリを実行すると、クエリキャッシュを有効にしない限り、常にデータベースにアクセスします。 – James