第1章冬眠とマイバティス
Hibernateは、現在最も人気のあるO/Rマッピングフレームワークです。 SF.NETで生まれ、現在はJBossの一部になりました。 MyBatisは、もう1つの優れたO/Rマッピングフレームワークです。現在、Apacheのサブプロジェクトに属しています。
MyBatis参考文献公式ウェブサイト:http://www.mybatis.org/core/zh/index.html
Hibernate参照資料:http://docs.jboss.org/hibernate/core/3.6/reference/zh-cn/html_single/
1.1 Hibernateの紹介
Hibernateは、データベース構造の比較的完全なカプセル化を提供します。 HibernateのO/Rマッピングは、POJOとデータベーステーブル間のマッピング、およびSQLの自動生成と実行を実装します。多くの場合、プログラマーはPojoとデータベーステーブルの間のマッピング関係を定義するだけで、Hibernateが提供する方法を介して永続性レイヤー操作を完了することができます。プログラマーは、SQLに習熟する必要さえありません。 Hibernate/OJBは、対応するSQLを自動的に生成し、JDBCインターフェイスを呼び出して、確立されたストレージロジックに従って実行します。
1.2 MyBatisの紹介
Ibatisの焦点は、PojoとSQLのマッピング関係にあります。次に、構成ファイルをマッピングすることにより、SQLと返された結果フィールドに必要なパラメーターが指定されたPOJOにマッピングされます。 Hibernate "o/r"と比較して、Ibatisは「SQLマッピング」のORM実装です。
第2章開発比較
開発速度
Hibernateの本当の習得はMybatisよりも困難です。 MyBatisフレームワークは比較的シンプルで使いやすいですが、比較的簡単です。個人的には、MyBatisをよく使用すると思います。最初に冬眠を理解しなければなりません。
開発コミュニティ
HibernateとMybatisはどちらも一般的な永続性層開発フレームワークですが、Hibernate開発コミュニティは比較的活気があり、多くのツールをサポートしており、更新はより速いです。現在の最高バージョンは4.1.8です。 MyBatisは比較的穏やかで、ツールが少なく、現在の最高バージョンは3.2です。
開発ワークロード
HibernateとMyBatisには、対応するコード生成ツールがあります。シンプルで基本的なDAOレイヤーメソッドを生成できます。
高度なクエリには、MyBatisにはSQLステートメントと結果マップの手動書き込みが必要です。 Hibernateには優れたマッピングメカニズムがあるため、開発者はSQLの生成と結果マッピングを気にする必要はなく、ビジネスプロセスにより多くの焦点を合わせることができます。
第3章システムチューニングの比較
Hibernateのチューニング計画は、合理的なキャッシュ戦略を開発します。
怠zyなロード機能を使用してみてください。
合理的なセッション管理メカニズムを採用します。
バッチグラブを使用して、合理的なバッチパラメーター(batch_size)を設定します。
合理的なO/Rマッピング設計を実行します
MyBatisチューニングソリューション
MyBatisは、セッションの観点からHibernateのセッションライフサイクルと一致しており、合理的なセッション管理メカニズムも必要です。 MyBatisには、レベル2のキャッシュメカニズムもあります。 MyBatisは、詳細なSQL最適化設計を実行できます。
SQL最適化の側面
Hibernateのクエリは、テーブル内のすべてのフィールドを照会し、パフォーマンス消費を引き起こします。 Hibernateは、SQL自体を記述して、照会する必要があるフィールドを指定することもできますが、これにより、冬眠発生のシンプルさが破壊されます。 MyBatisのSQLは手動で記述されるため、必要に応じてクエリ用のフィールドを指定できます。
Hibernate HQLステートメントのチューニングにはSQLの印刷が必要であり、多くの人々はHibernateのSQLが醜すぎるため嫌いです。 MyBatisのSQLは自分で手動で書かれているため、簡単に調整できます。しかし、Hibernateには独自のログ統計があります。 MyBatis自体にはログ統計が含まれておらず、ロギングにlog4jを使用します。
スケーラビリティ
Hibernateと特定のデータベースとの関連は、XMLファイルでのみ構成する必要があります。すべてのHQLステートメントは、使用される特定のデータベースとは関係ありません。また、非常にポータブルです。 MyBatisプロジェクトのすべてのSQLステートメントは、使用されるデータベースに依存するため、さまざまなデータベースタイプのサポートは良くありません。
第4章オブジェクト管理とクロール戦略
オブジェクト管理
Hibernateは、オブジェクト状態管理の機能を提供する完全なオブジェクト/リレーショナルマッピングソリューションであるため、開発者は基礎となるデータベースシステムの詳細に注意を払う必要がなくなりました。つまり、SQLステートメントの管理を必要とする一般的なJDBC/SQL永続性レイヤーシナリオと比較して、HibernateはJavaアプリケーションでデータを持続するために、より自然なオブジェクト指向の視点を採用しています。
言い換えれば、Hibernateを使用している開発者は常にオブジェクトの状態に注意を払う必要があり、SQLステートメントの実行を検討する必要はありません。詳細のこの部分はHibernateによって管理されており、システムのパフォーマンスを調整する際に理解する必要があるのは開発者のみです。
MyBatisにはこの領域にドキュメントがないため、ユーザーはオブジェクト自体を詳細に管理する必要があります。
クロール戦略
Hibernateには、エンティティ関連のオブジェクトをraw索するための優れたメカニズムがあります。各アソシエーション関係について、荷重を遅らせるかどうかを詳細に設定でき、4つのモードが提供されます:関連性クロール、クエリクロール、サブクエリクロール、バッチクロール。詳細に構成および処理されます。
MyBatisの怠zyなロードはグローバルに構成されています。
第5章キャッシュメカニズムの比較
冬眠キャッシュ
Hibernateレベル1キャッシュはセッションキャッシュです。レベル1キャッシュをうまく使用する場合は、セッションのライフサイクルを適切に管理する必要があります。アクション操作でセッションを使用することをお勧めします。レベル1キャッシュには、セッションの厳格な管理が必要です。
Hibernateレベル2キャッシュは、SessionFactoryレベルのキャッシュです。 SessionFactoryのキャッシュは、内蔵キャッシュと外部キャッシュに分割されます。組み込みのキャッシュは、SessionFactoryオブジェクト(マッピング要素データと事前に決められたSQLステートメントなど)のいくつかのコレクション属性に含まれるデータを保存します。これは、アプリケーションの読み取り専用です。外部キャッシュは、一次キャッシュに似たデータベースデータのコピーを保存します。メモリをストレージメディアとして使用することに加えて、セカンダリキャッシュはハードディスクなどの外部ストレージデバイスを使用することもできます。セカンダリキャッシュは、プロセスレベルのキャッシュまたはSessionFactoryレベルのキャッシュと呼ばれます。それはすべてのセッションで共有でき、そのライフサイクルは存在し、セッションファクトリーのライフサイクルとともに消えます。
mybatisキャッシュ
MyBatisには、非常に強力なクエリキャッシュ機能が含まれており、非常に簡単にカスタマイズできます。 MyBatis 3のキャッシュ実装の多くの改善が実装されており、より強力で構成が簡単になりました。
デフォルトでは、キャッシュは有効になりません。ローカルセッションのキャッシュに加えて、収益化を強化し、循環依存関係を処理することもできます。レベル2キャッシュを有効にするには、SQLマッピングファイルに行を追加する必要があります。<Cache/>
それは文字通りです。この単純なステートメントの効果は次のとおりです。
マッピングステートメントファイルのすべての選択ステートメントはキャッシュされます。
マッピングステートメントファイルにステートメントを挿入、更新、削除するすべてのキャッシュを更新します。
キャッシュは、最近使用されていない(LRU、最近使用されていない)アルゴリズムを使用して取得されます。
スケジュール(フラッシュ間隔がない、更新間隔がないなど)に応じて、キャッシュは時系列の順序で更新されません。
キャッシュは、リストコレクションまたはオブジェクトへの1024の参照を保存します(クエリメソッドが返すものに関係なく)。
キャッシュは、読み取り/書き込み(読み取り可能/書き込み可能)キャッシュと見なされます。つまり、オブジェクトの検索は共有されず、他の発信者やスレッドによる潜在的な変更を妨げることなく、発信者が安全に変更できます。
これらのプロパティはすべて、キャッシュ要素のプロパティによって変更できます。
例:<キャッシュeviction = "fifo" flushinterval = "60000" size = "512" readonly = "true"/>
このより高度な構成により、FIFOキャッシュが作成され、60秒ごとにリフレッシュされ、結果のオブジェクトまたはリストへの512の参照を保存し、返されたオブジェクトは読み取り専用と見なされ、異なるスレッドで発信者間でそれらを変更すると競合が発生します。利用可能な回復戦略は、デフォルトはLRUです。
LRU少なくとも最近使用:最も長い間使用されていないオブジェクトを削除します。
FIFOファーストインファーストアウト:キャッシュを入力する順序でオブジェクトを削除します。
ソフトソフト参照:ガベージコレクターの状態およびソフト参照ルールに基づいてオブジェクトを削除します。
弱い弱い参照:ガベージコレクターの状態と弱い参照ルールに基づいて、より積極的にオブジェクトを削除します。
Flushintervalは、任意の正の整数に設定でき、合理的なミリ秒の期間を表します。デフォルトは設定されていません。つまり、更新間隔はありません。ステートメントが呼び出された場合にのみキャッシュが更新されます。
サイズ(参照の数)は、任意の正の整数に設定できます。キャッシュするオブジェクトの数と、実行中の環境で利用可能なメモリリソースの数を覚えておいてください。デフォルト値は1024です。
readonlyプロパティは、trueまたはfalseに設定できます。読み取り専用キャッシュは、キャッシュオブジェクトの同じインスタンスをすべての発信者に返します。したがって、これらのオブジェクトは変更できません。これは、重要なパフォーマンスの利点を提供します。読み取り可能で書き込み可能なキャッシュは、キャッシュオブジェクトのコピーを返します(シリアル化により)。これは遅くなりますが安全なので、デフォルトでは誤っています。
類似点
システムのデフォルトのキャッシュメカニズムを使用することに加えて、HibernateとMybatisの二次キャッシュは、独自のキャッシュを実装したり、他のサードパーティキャッシュソリューションのアダプターを作成したりすることで、キャッシュ動作を完全に上書きすることができます。
違い
Hibernateのセカンダリキャッシュ構成は、SessionFactoryによって生成された構成ファイルで詳細に構成され、特定のTable-Objectマップで構成されます。
MyBatisのセカンダリキャッシュ構成は、特定のテーブルオブジェクトマップごとに詳細に構成されているため、さまざまなキャッシュメカニズムをさまざまなテーブル用にカスタマイズできます。 MyBatisは、Cache-Refを介して実装される名前空間で同じキャッシュ構成とインスタンスを共有できます。
2つの比較
Hibernateにはクエリオブジェクトの優れた管理メカニズムがあるため、ユーザーはSQLを気にする必要はありません。したがって、セカンダリキャッシュを使用するときに汚れたデータが表示される場合、システムはエラーとプロンプトを報告します。
この点で、MyBatisはL2キャッシュを使用する際に特別な注意が必要です。データの更新操作の範囲を完全に決定できない場合は、キャッシュの盲目的な使用を避けてください。それ以外の場合、汚れたデータの外観は、システムの通常の動作に大きな隠れた危険をもたらします。
第6章HibernateとMybatisの比較と要約
2つの類似点
HibernateとMyBatisは、sessionFactoryBuiderを介してXML構成ファイルからSessionFactoryを生成し、SessionFactoryからセッションを生成し、最後にトランザクションとSQLステートメントを実行できます。その中で、SessionFactoryBuider、SessionFactory、およびセッションのライフサイクルはほぼ同じです。
HibernateとMyBatisの両方がJDBCとJTAトランザクションをサポートしています。
MyBatisの利点
MyBatisは、より詳細なSQL最適化を実行し、クエリフィールドを削減できます。
MyBatisは簡単に習得できますが、Hibernateにはより高いしきい値があります。
休暇の利点
HibernateのDAO層の開発はMyBatisよりも簡単で、SQLと結果マッピングのメンテナンスが必要です。
HibernateはMyBatisよりもオブジェクトをよく維持し、キャッシュします。追加、削除、変更、チェックされたオブジェクトを維持する方が便利です。
Hibernateデータベースには良い移植性があり、MyBatisデータベースの移植性が低く、異なるSQLを記述するにはさまざまなデータベースが必要です。
Hibernateには、サードパーティキャッシュを使用できるL2キャッシュメカニズムが向上しています。 MyBatis自体は、キャッシングメカニズムが不十分であることを提供します。
その他の要約
Hibernateには、強力な機能、優れたデータベースの無関係性、強力なO/Rマッピング機能があります。冬眠に非常に熟練しており、冬眠を適切にカプセル化する場合、プロジェクトの永続レイヤーコード全体が非常に簡単になり、記述するコードはほとんどなく、開発速度は非常に高速で非常にクールです。
冬眠の欠点は、学習しきい値が低くなく、熟練している必要があることです。 O/Rマッピングを設計する強力な経験と能力、パフォーマンスとオブジェクトモデルのバランスを取る方法、および冬眠をうまく使用する方法が必要です。
IBATISは、始めて、学習と使用を簡単にし、データベースクエリに自動オブジェクトバインディング機能を提供し、優れたSQL使用体験を継続します。これは、このような高いオブジェクトモデルの要件を持たないプロジェクトに最適です。
Ibatisの欠点は、フレームワークがまだ比較的単純であり、機能がまだ欠落していることです。データバインディングコードは簡素化されていますが、基礎となるデータベースクエリ全体を実際に自然に記述する必要がありますが、ワークロードは比較的大きく、迅速なデータベースの変更に適応するのは簡単ではありません。