私たちのプロジェクトでは、Spring JDBCTemplate と Hibernate のどちらかを決定する必要があります。
パフォーマンスと実装と設計の点でどちらが優れているか知りたいです。そしてどうやって?
私たちのプロジェクトでは、Spring JDBCTemplate と Hibernate のどちらかを決定する必要があります。
パフォーマンスと実装と設計の点でどちらが優れているか知りたいです。そしてどうやって?
両方の実装を非常に高速にするためにできる限りのことを行うと、Hibernate のようなオーバーヘッドがないため、JDBC テンプレートはおそらく少し高速になります。しかし、実装にはおそらくもっと多くの時間とコード行が必要になるでしょう。
Hibernate には学習曲線があり、舞台裏で何が起こっているか、エンティティを返す代わりにプロジェクションをいつ使用するかなどを理解する必要があります。しかし、それをマスターすれば、多くの時間を節約でき、JDBC よりもクリーンでシンプルなコードを作成できます。ベースのソリューション。
95% のケースで、Hibernate は十分に高速であるか、最適化されていない JDBC コードよりも高速であると言えます。残りの 5% については、Spring-JDBC など、他のものを使用することを禁じるものは何もありません。どちらのソリューションも相互に排他的ではありません。
それはあなたのプロジェクトと、Hibernate モデルがあなたの考え方にどれだけ適合するかによって異なります。速度/パフォーマンスは関係ありません: Hibernate の動作について理解できない場合、プロジェクトは奇妙なバグでいっぱいになり、見つけて修正するのに何年もかかります。
また、Hibernate の内部がモデルと DAO に漏れることにも注意してください。注目すべき競合点は、通常equals()/hashCode()
、トランザクション外でのコレクションの遅延読み込みです。Hibernate の例は非常に単純で、短時間で多くのことを達成できるため、Hibernate が単純であるという誤解につながる可能性があります。そうではありません。Hibernate は多くの想定を行い、特定の方法で考えてコーディングすることを強制します。
JDBC自体の非常に薄いラッパーであるため、使用JdbcTemplate
が簡単です。ここでの代償は、本当に退屈なコードを何千行も書くことです。また、SQL 文字列は保守が非常に難しいことがわかります。データ モデルが変更されると、影響を受ける可能性のあるすべての場所をコード ベース全体で検索する必要があります。それはきれいではありません。
私たち自身のプロジェクトでは、非常に複雑なデータ構造 (修正されたツリー構造) があり、実行時に複雑な検索クエリを作成する必要があるため、Hibernate を使用しないことにしました。代わりに、jOOQを使用して独自の DAO レイヤーを作成しました。jOOQ は、Java で適切な DSL を使用して SQL を記述できるようにする JDBC の薄いラッパーです。
create.selectFrom(BOOK)
.where(PUBLISHED_IN.equal(2011))
.orderBy(TITLE)
Hibernate と同様に、jOOQ には従うべきルールがいくつかあります。従わないと満足できませんが、これらのルールははるかに寛大です。
別のオプションとして、 Spring Dataを確認する必要があります。簡単に言えば、Spring Data を使用すると、リモートでデータベースに似たものにデータを保存できます。これは、モデルを Hibernate で管理し、NoSQL データベースを使用して別のモデルを管理できることを意味します。または、必要に応じてモデルの一部を簡単に移行できます。
重要な機能の 1 つは、DAO の実装が次のように見えることです。
public interface UserRepository extends Repository<User, Long> {
List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
}
これはメソッド定義を持つ単なるインターフェースであるため、実装がどこにあるのか疑問に思うかもしれませんが、それだけです。実行時に、Spring Data はこのメソッドを実装するコードを生成します。これが可能なのは、必要なすべてのクエリの 99% が「列 X が ... であるすべての行のクエリ テーブル」という形式であるため、このユース ケースを最適化したためです。
OTOH、実行時に非常に複雑な検索クエリを作成することがすでにわかっている場合、Spring Data はおそらくあまり役に立ちません。
私たちのプロジェクトでは、JdbcTemplate
との両方を使用していHibernate
ます。あなたがする必要があるのは、 とDataSource
の間hibernate
で共有することですjdbcTemplate
。どちらも運用に応じて性能を確認できますが、どちらか良い方を使用します。ほとんどの場合、通常の操作には休止状態を使用しています。大きなクエリや重い操作がある場合は、jdbc のパフォーマンスをチェックし、どちらか適切な方を休止状態にします。
良い点は、HibernateTransactionManagerが (JdbcTemplate、プレーンな jdbc) と休止状態の両方で機能することです。