18

インメモリ HSQL データベースで、5 秒ごとに少なくとも 8000 オブジェクトの一貫した速度でオブジェクトを挿入/更新できる必要があります。

Spring/Hibernate/JPA と純粋な JDBC の間でいくつかの比較パフォーマンス テストを行いました。HSQL を使用すると、パフォーマンスに大きな違いがあることがわかりました。Spring/Hib/JPA を使用すると、1.5 KB オブジェクト (1 対多および多対多の関係) を 5 秒で 3000 ~ 4000 個挿入できますが、直接ではJDBC 呼び出しでは、同じオブジェクトを 10,000 ~ 12,000 個挿入できます。

なぜこのような大きな違いがあるのか​​ わかりません。Spring/Hib/JPA の設定を何度も微調整して、運が悪ければパフォーマンスに近づこうとしました。将来の目的、拡張性、および外部キー関係 (1 対多および多対多) を手動で維持するのが難しいため、Spring/Hib/JPA を使用したい。しかし、パフォーマンス要件は、純粋な JDBC の使用を指しているようです。

なぜこのような大きな違いが生じるのか、何か考えはありますか?

4

5 に答える 5

16

バッチモード(Statement#executeBatch())でHibernateとJDBCを比較した同様の経験があります。基本的に、Hibernateはバルク操作ではうまく機能しないようです。私たちの場合、Hibernateの実装は本番ハードウェアで十分に高速でした。

あなたがしたいと思うかもしれないことは、データベース呼び出しをDAOでラップし、アプリケーションにデータにアクセスする一貫した方法を与えることです。便利な場合はHibernateを使用し、パフォーマンス要件で必要な場合はJDBCを使用してDAOを実装します。

于 2008-11-04T02:54:20.027 に答える
10

少なくとも、Hibernate でバッチ挿入を行う必要があります: http://www.hibernate.org/hib_docs/reference/en/html/batch.htmlラウンドトリップ時間を大幅に節約します。

また、Justice が述べたように、Hib の主な目標はコンピューターのパフォーマンスではなく、開発者のパフォーマンスです。そうは言っても、通常は JDBC の結果に匹敵する (同等ではありませんが、それほど悪くはありません) ことは可能です。

于 2008-11-04T11:10:36.220 に答える
5

Hibernate は、オブジェクトの第 1 レベルのキャッシュを維持し、ダーティ チェックで使用するだけでなく、作業単位および ID マップとして機能します。これにより、特に一括タイプの操作でオーバーヘッドが増加します。一括操作の場合、この状態を維持しないStatelessSessionsを調査することをお勧めします。

于 2008-11-04T02:47:18.093 に答える
5

すべての問題に対して 1 つのテクノロジを使用しないでください。問題に応じて、使用するテクノロジーを決定します。もちろんjpaやhibernateはjdbcより遅いです。jdbc は jpa よりも下位レベルにあります。また、jdbc を使用する db プロフェッショナルは、jpa よりも最適化された sql を作成できます。速度が必要なクリティカルポイントを指定した場合、jpa は選択できません。

于 2010-04-20T08:39:12.660 に答える
2

そのすべてのマッピング...それは少し高価になる可能性があり、すべての難解なロジックとすべての反射と一貫性チェックが必要です。

もちろん、マッピングのポイントはパフォーマンスを向上させることではありません。通常、パフォーマンスが低下します。しかし、パフォーマンスで失うものは、開発者の生産性、一貫性、テスト容易性、信頼性、およびさらに多くの切望された属性で何倍も得ることができます。通常、追加のパフォーマンスが必要で、マッピングをあきらめたくない場合は、ハードウェアを追加します。

于 2008-11-04T02:59:36.273 に答える