2012-03-06 3 views
2

Hibernateは、内部キャッシュとオブジェクト状態の管理のため、基本的にデータベース上のすべての操作にオーバーヘッドを導入しています。Hibernateでのフェッチパフォーマンスの向上

私たちが現在行っているアプリケーションでは、プレーンSQL(JDBC)を使用してデータを読み取り、Hibernateを使用して保存と更新を行うというものです。理由は、計算のたびに多くの情報をロードする必要がありますが、限られた部分だけを更新する必要があるということです。

今、私たちは、このアプローチは本当にクリーンではないことを知っていると私たちはHibernateの読書を微調整しようとしましたが、私たちが達成したことは、次のされていくつかのテストでした:

読む時間JDBC(session.doWorkを) :23秒
読む時間休止(怠惰とsession.createQueryフェッチ):94秒

オーバーヘッドを既存のHibernateの追加処理によるものであり、我々が読ん並列あれば、それ自体が任意の助けになる可能性が疑問に思ったことを私たちには思えます(私たちは並行して行うことができる多くのテーブルを読んでいます)? Hibernateのセッションとトランザクションは、複数のスレッドから安全に使用できるように設計されていますか?

また、他のアイデアがあれば、これをスピードアップするのに役立つものはありがたいです。

答えて

4

読み込み自体を並列化すると、何らかの助けになる可能性があります(私たちは並行して実行できるテーブルをたくさん読んでいます)?

によって異なります。データベースがクラスター化されているか、または異なる表が異なる物理ディスクまたは機械上にある異なる表スペースに存在する場合、並列化によって処理が高速化する可能性があります。それ以外の場合、I/Oがボトルネックになります。

また、クエリを一度コンパイルして再利用すると、データベースサーバーの解析/コンパイルフェーズに時間がかかることがあります(ただし、この部分はCPUにバインドされているため実際には正常に並列化できます)。

Hibernateのセッションとトランザクションは、複数のスレッドから安全に使用できるように設計されていますか?

絶対にありません。 Hibernateのセッションとトランザクションは、本質的にデータベース接続にバインドされています。接続はシングルスレッドです。

また、他のアイディアがあれば、これをスピードアップするのに役立つものはありがたいです。

  • 使用することは、あなたの接続プールが

  • 適切に設定されていることを確認し
  • 休止

    にDBMS

  • L2と実験とクエリキャッシュをコンパイルのオーバーヘッドを回避するために、文/コンパイル済みのクエリを準備しました

  • GC活動とmemomry消費を監視していますが、あなたのHibernateセッションが大きくなりすぎている可能性がありますか?

  • は、ストアドプロシージャを検討し、彼らは素早く答えを

+0

おかげではるかに高速になる傾向があり、それは、我々はすべてのことを試してみましたが、今はこの4倍のオーバーヘッドで立ち往生していることを縫い目。 – mario

+0

@mario:プロファイリングを試しましたか?しかし正直なところ、生のJDBCの23秒ということは、たくさんのクエリを実行していることを意味します.Hibernateがすべてのリフレクション/ HQLオーバーヘッド(おそらく基準APIか、バッチ処理)(http:// docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html))また、Hibernateは最速のJPAプロバイダではありません:http://www.jpab.org –

+0

データが、クエリはほんのわずかです。私の本能は、2-5倍のオーバーヘッドが予想され、私たちの達成度(4倍)は期待通りであると私に伝えています。私はjpabをチェックする(これまで聞いたことがない)。ありがとう! – mario

関連する問題