大規模な結果セットを期待するPostgreSQLのクエリは、自動コミットをオフにしてResultSet.TYPE_FORWARD_ONLY(hereを参照)を実行するのが最適です。しかし、SpringLinkとEclipseLinkを併用すれば、これをどのように実現できますか?誰かがこれを経験していますか(特に自動コミットを設定する)?Spring JPA/EclipseLinkを使用したPostgreSQLクエリの結果が大きい
乾杯、 ステファン
大規模な結果セットを期待するPostgreSQLのクエリは、自動コミットをオフにしてResultSet.TYPE_FORWARD_ONLY(hereを参照)を実行するのが最適です。しかし、SpringLinkとEclipseLinkを併用すれば、これをどのように実現できますか?誰かがこれを経験していますか(特に自動コミットを設定する)?Spring JPA/EclipseLinkを使用したPostgreSQLクエリの結果が大きい
乾杯、 ステファン
は、JPAプロバイダは、あなたが話しているもののような低レベルの接続の詳細を処理することになっています。 JPAでは、QueryインタフェースでsetMaxResults()メソッドを呼び出して返される行数を制限できます。その後、setFirstResult()を使用して、実行時に結果セットをページすることができます。 EclipseLinkのPostgresの方言実装は、ポストグルとの通信を可能な限り効果的にするための最善の努力を担当しています。
http://download.oracle.com/javaee/5/api/javax/persistence/Query.html
自動コミットをオフあなたはJPAを使用しているデフォルトのモードです。そうでなければ、トランザクションを実装できませんでした。結果セットはデフォルトでのみ前方にあると私は確信しています。
以下は私のために働いているようです。クリティカルな部分はQueryHints.JDBC_FETCH_SIZEのようです。また、結果データのキャッシュには多くの手間がかかります。
Query q = em.createNamedQuery("name");
q.setHint(QueryHints.CURSOR, HintValues.TRUE);
q.setHint(QueryHints.CURSOR_PAGE_SIZE, 1000);
q.setHint(QueryHints.MAINTAIN_CACHE, HintValues.FALSE);
q.setHint(QueryHints.JDBC_FETCH_SIZE, 1000);
CursoredStream cursor = (CursoredStream)q.getSingleResult();
while(cursor.hasNext()) {
MyObject o = (MyObject)cursor.next();
// do something wit data
}
これは本当に標準的な方法ですか?私がjava.sql.ResultSetと比較すると、結果セットを反復処理するときに自動的に計算されるフェッチ・サイズを定義できます。 Spring JPAを使用しているとき、私は本当に(多かれ少なかれ)手動で(単純ですが)行う必要がありますか? – Steffen