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 を試しました
あなたの助けに感謝。
ありがとう、サントッシュ