2016-09-26 10 views
1

私はパフォーマンスの改善に取り組んでいます。私たちはHibernate CriteriaとNamed Queryの両方を使用してデータベースからデータを取得しています。 私たちのアプリケーションでは、データベースからより多くの行を取得してJavaロジックを実行していますので、データベースからネットワークへのトリップを避けるために、データベースから一度に多くの行をフェッチしたいと考えています。 oracleデータベースのデフォルトのフェッチ・サイズが10であるため、次のように基準オブジェクトに対してこれを400に設定しました。Hibernate criteria.setFetchSizeが期待どおりに動作しない

Criteria crit = getSession().createCriteria(Phone.class); 
crit.setFetchSize(400); 

私は応答時間の改善に気付きませんでした。 以下のようにNamedQueryでフェッチサイズを高く設定したときに改善が見られました。

Query query = session.getNamedQuery("getPhoneList"); 
query.setFetchSize(400); 

crit.setFetchSize(400);が期待どおりに機能しない理由を教えてください。

+0

あなたはデシベルにTCPトラフィックを検査しようとすることができますたとえば、Wiresharkを使用して、フェッチサイズを設定する前後に何が起こるのかを理解しようとする(setFetchSizeが "ネットワークトリップ"にどのように影響するかを理解するため)。 –

答えて

0

私はこの問題をテストしましたが、crit.setFetchSize(400);は返された結果を制限していないようです。しかし、あなたのDBからの返品結果を制限する別の有用な方法setMaxResults(int maxResults)があります。

HibernateのAPIから次の画像を見てみましょう:

私は多分それが赤の内の第2の方法に関連しています、赤で明らかに要求された行動をしていないされているメソッドをマークしているenter image description here

矩形。

DBからの検索結果を制限する方法と緑の四角形を見てみましょう:リストの最大サイズは400

+1

setMaxResults(400)は結果行の合計数を制限します。私の要件は結果の行を制限するものではありません。データベースからのデータは、アプリケーション・サーバーにチャンク単位で戻されます(oracleでは10行のデフォルト・サイズ)。私のクエリが多数の行を返すと、データベースへのネットワークトリップが増えます。チャンクサイズを400のように高く設定して、データベースへのネットワークトリップ回数を最小限に抑えたい。 setFetchSize()は大きな行の結果行を返さなければなりませんが、私のコードで期待どおりに動作しているのを見ていません。 –

0

答えになります

enter image description here

Criteria crit = getSession().createCriteria(Phone.class).setMaxResults(400); 
List<Phone> list = crit.list(); 

次の投稿は、なぜsetFetchSizeが適用されないのかを説明するものでもあります。

What is difference between setMaxResults and setFetchSize in org.hibernate.Query?

彼はデータベースドライバを語る第二部、jazzinthemorningが言う:

setFetchSizeメソッドは、すべてのデータベースドライバによって実装されていません

関連する問題