web-dev-qa-db-ja.com

パフォーマンスの観点からSpring JDBCTemplate VS Hibernate

このプロジェクトでは、Spring JDBCTemplateとHibernateのどちらかを決定する必要があります。

パフォーマンスと実装および設計の点でどちらが優れているかを知りたいですか?

41
Amruta

両方の実装を非常に高速にするためにできる限りのことを行うと、Hibernateのオーバーヘッドがないため、JDBCテンプレートはおそらく少し高速になります。ただし、実装にはさらに多くの時間とコード行が必要になるでしょう。

Hibernateには学習曲線があり、エンティティを返す代わりにプロジェクションを使用する場合など、舞台裏で何が起こるかを理解する必要があります。ベースのソリューション。

95%のケースで、Hibernateは十分に高速であり、最適化されていないJDBCコードよりも高速です。残り5%については、たとえばSpring-JDBCなど、他の何かを使用することを禁止するものはありません。両方のソリューションは相互に排他的ではありません。

49
JB Nizet

それはあなたのプロジェクトとHibernateモデルがあなたの考えにどれだけうまく適合するかに依存します。速度/パフォーマンスは関係ありません:Hibernateの動作について気にしないと、プロジェクトは、見つけて修正するのに時間がかかる奇妙なバグに埋もれます。

また、Hibernateの内部がモデルとDAOにリークすることに注意してください。競合の顕著なポイントは通常、equals()/hashCode()およびトランザクション外のコレクションの遅延ロードです。 Hibernateのサンプルは非常に単純であり、短時間で多くのことを達成できるため、Hibernateが単純であるという誤解を招く可能性があります。そうではありません。 Hibernateは多くの仮定を行い、特定の方法で考えてコーディングすることを強制します。

JdbcTemplateを使用する方が簡単です。これは、JDBC自体の非常に薄いラッパーにすぎないためです。ここでの代償は、何千行もの本当に退屈なコードを書くことです。また、SQL文字列の保守が非常に困難であることがわかります。データモデルが変更された場合、影響を受ける可能性のあるすべての場所をコードベース全体で検索する必要があります。それはきれいではありません。

私たち自身のプロジェクトでは、本当に複雑なデータ構造(改訂されたツリー構造)があり、実行時に複雑な検索クエリを作成する必要があるため、Hibernateを使用しないことにしました。代わりに、 jOOQ を使用して独自のDAOレイヤーを作成しました。 jOOQはJDBCの薄いラッパーで、JavaでNice DSLを使用してSQLを記述できます。

create.selectFrom(BOOK)
      .where(PUBLISHED_IN.equal(2011))
      .orderBy(TITLE)

Hibernateのように、jOOQには従わなければならないルールがいくつかあります。そうしないと、満足できませんが、これらははるかに寛大です。

別のオプションとして、 Spring Data をご覧ください。簡単に言えば、Spring Dataを使用すると、リモートでデータベースに似たものにデータを保存できます。これは、NoSQLデータベースを使用して、Hibernateと別のモデルでモデルを管理できることを意味します。または、必要に応じてモデルの一部を簡単に移行できます。

主な機能の1つは、DAOimplementationが次のように見えることです。

public interface UserRepository extends Repository<User, Long> {

  List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
}

実装はどこにあるのか疑問に思うかもしれません。これは単なるメソッド定義を持つインターフェースですが、それだけです。実行時に、Spring Dataはこのメソッドを実装するコードを生成します。これが可能なのは、必要なすべてのクエリの99%が「列Xが...であるすべての行のクエリテーブル」の形式であるため、このユースケースを最適化したためです。

OTOH、実行時に本当に複雑な検索クエリを作成することを既に知っている場合、Spring Dataはおそらくあまり役​​に立ちません。

35
Aaron Digulla

このプロジェクトでは、JdbcTemplateHibernateの両方を使用しています。必要なことは、DataSourcehibernateの間でjdbcTemplateを共有することです。操作に応じて両方のパフォーマンスを確認できますが、どちらか適切な方を使用します。ほとんどの場合、通常の操作にhibernateを使用します。大きなクエリまたは重い操作がある場合は、jdbcとhibernateのどちらか適切な方のパフォーマンスを確認します。

良い点は、 HibernateTransactionManager (JdbcTemplate、プレーンjdbc)とhibernateの両方で機能することです。

15

データベース設計は休止状態に優しいですか?はいの場合は、休止状態を使用します...そうでない場合は、それを避けることができます。 Jdbctemplateには多くの利点があり、SQLクエリを簡単に維持できるようにする方法があります。すべてを保持するクラス、またはファイルなどから読み取るクラスを用意します。列を更新する必要がある場合は、標準のjdbcを使用して結果セットのメタデータを取得し、列名を取得する方法があります。これは複雑かもしれませんが、問題を解決する興味深い方法です。 Hibernateは優れたツールですが、複雑なデータモデルにより、非常に扱いにくくなります。

0
Pasha Utt