3

Web アプリケーションのベンダーとして、休止状態で JPA 2.0 を使用しています。データベース クエリの 1 つで、JPA 基準ビルダー API を使用して動的クエリを作成しています。期待通りに動作させることができました。

クエリには、2 つのテーブル A と B の間にフェッチ結合があります。A には B との OneToMany 関係があります。

Join<A,B> ordLeg = ord.joinSet("bLegs", JoinType.INNER);
ord.fetch("bLegs",JoinType.INNER);

また、no を制限するために setMaxResults を使用しました。ユーザーに返されるレコードの

typedQuery.setMaxResults(10);

参考までに、データベースには約 400 のレコードがあります。

ログでクエリの結果を見ると、400 レコードすべてがメモリに読み込まれていることがわかります。ただし、Maxresults が設定されているため、ユーザーには 20 レコードしか返されません。

さらに分析すると、hibernate には、メモリ内の 400 レコードすべてをロードするのではなく、レコードをバッチで取得するためのヒントがあることがわかりました。

TypedQuery<A> typedQuery = entityManager.createQuery(query);
typedQuery.setHint("org.hibernate.fetchSize", 5);
List<A> orderList = (List<A>) typedQuery.getResultList();

しかし、それはまったくヒントを得ていないようです。400 レコードすべてがメモリにロードされ、バッチ フェッチが行われていないことがまだわかります。5 の 2 つのバッチで 10 (maxResults) レコードをフェッチすることを期待しています。何か不足していますか?\

指定したクエリの DB に 1000 を超えるレコードがある場合、パフォーマンスが大幅に低下します。

persistence.xml レベルで次のプロパティを設定しようとしましたが、無駄でした。

<properties>
<property name="hibernate.jdbc.batch_size" value="5"/>  
<property name="hibernate.jdbc.fetch_size" value="5">
</properties>

正しい方向に私を助けてもらえますか?

Hibernate バージョン: 3.6.4.Final、4.0.0.Final、および 4.2.1.Final を試しました

あなたの助けに感謝。

ありがとう、サントッシュ

4

1 に答える 1