2016-08-29 21 views
2

私は '句'に2 'を持つクエリを持っています。最初の句は約125の値をとり、2番目の句は約21000の値をとります。 JPA CriteriaBuilderを使用して実装されています。Hibernate JPA EntityManager.createQuery()performance

クエリ自体が非常に高速に実行され、数秒で結果が返されます。問題があるのはentityManager.createQuery(CriteriaQuery)です。戻りには12〜13分かかります。

私はすべてのスレッドを検索し、すべてのスレッドはQuery.getResultListのパフォーマンスに関連しています。彼らの誰も、entityManager.createQuery(CriteriaQuery)のパフォーマンスについて話しません。このような動作が早い場合は、解決方法を教えてください。

JDKのバージョンは1.7です。 javaee-apiの依存バージョンは6.0です。アプリケーションはJBOSS EAP 6.4にデプロイされます。実際のOracleデータベースに接続されているEntityManagerを使用しているjunitを使用してコードをテストしているので、今のところそれは問題ではありません。より多くの情報が必要な場合は、私に教えてください。

+0

JPAは単なるAPIであるため、問題の原因となる可能性のある実装があります。休止状態? OpenJPA? EclipseLink? – Gimby

+1

あなたのアプリケーション(YourKitまたはJProfilerなど)をプロファイルしようとしましたか? – hunter

+0

@Gimby:まあ、java-api-6.0 jarで利用可能なjavax.persistence。*のすべてのAPIを使用しています。私たちは、休止状態の特定のAPIを使用していません。私のアプリケーションはJBOSS EAP 6.4にデプロイされています。 – user613114

答えて

0

を結果により通知私たちを維持し、幸運

EntityManagerFactory addNamedQuery() 

を使用して、名前付きクエリに変換することができます1000個の式)、すべてOR句と組み合わせると、クエリの実行が遅くなりました。別のクエリの一部としてすべてのIN句を実行する別のアプローチを試しました。したがって、これらの21個の個別のクエリは全体的に優れていました。

私が観察したもう1つの問題は、結果セットが巨大な場合(結果セットの20K行のようなもの)、CriteriaBuilderでのクエリが遅いことでした。私は入力クエリにクエリヒントを追加してこの問題を解決しました:

TypedQuery.setHint("org.hibernate.fetchSize", 5000); 

他にも役立つことを願っています。

0

ハイブリッド手法は、クエリを動的に作成し、エンティティマネージャファクトリに名前付きクエリとして保存することです。

この時点で、メタデータに静的に宣言されている他の名前付きクエリと同じになります。これは良い妥協のように見えるかもしれませんが、ほんのわずかの特定のケースで有用であることが分かります。ランタイムまで知られていないクエリが繰り返して再発行された場合の主な利点があります。ダイナミッククエリが名前付きクエリになると、処理コストは1度しか負担されません。

クエリが名前付きクエリとして登録されたときにそのコストが支払われるか、最初に実行されるまで延期されるかは実装固有です。

動的問合せは、私は句で21(それぞれを単一のクエリを有することが観察さ