6

Hibernateの実行可能な代替手段はありますか?できれば、JPAに基づかないものが望ましいです。

私たちの問題は、複雑な(多くのオブジェクトが相互に参照しているように)ステートフルRIAシステムを構築していることです。Hibernateは、主に1回限りのアプリケーション(JSFなど)で使用するように設計されているようです。

問題は主に遅延読み込みの問題です。初期化と実際にレイジーコレクションをロードするまでの間に複数のHTTPリクエストが存在する可能性があるため、トランザクションごとのセッションは問題外です。トランザクションが障害にぶつかって例外をスローすると、セッション全体が無効になり、遅延ロードされたオブジェクトが破損するため、長期間有効なセッション(アプリケーションごとに1つ)もうまく機能しません。次に、私たちには機能しないあらゆる種類のものがあります(初期化されたトランザクションの外部からのデータの暗黙的なデータ永続化など)。

私の貧弱な説明はさておき、肝心なのは、Hibernateは私たちが好きではない魔法をやっているということです。TopLinkはこれ以上優れていないようで、EJBの上に記述されています。

したがって、ステートレス永続化レイヤー(または十分に明るいオブジェクト指向のデータベース抽象化レイヤー)が最も必要なものです。

何か考えがありますか、それとも私は存在しない何かを求めていますか?

編集:あいまいな用語をお詫び申し上げます。訂正と洞察に満ちた回答をありがとうございました。私を訂正した人たち、あなたはすべて正しいです、私はEJBではなくJPAを意味しました。

4

11 に答える 11

7

別のJPAプロバイダー(Hibernateはこれらの1つです)を探している場合は、EclipseLinkを見てください。これは、TopLinkEssentialsのJPA1.0リファレンス実装よりもはるかに完全な機能を備えています。実際、EclipseLinkは、GlassfishV3Finalに同梱されているJPA2.0リファレンス実装になります。

JPAは、コンテナーの内側と外側の両方で使用できるため、優れています。JPAを効果的に使用するSwingクライアントを作成しました。EJB 2.0/2.1に付属していたものと同じ汚名やXMLの手荷物はありません。

さらに軽量なソリューションをお探しの場合は、Javaプラットフォームに最適な永続化テクノロジーであるibatisをご覧ください。軽量で、SQLに依存し(ORMユーザーがORMで優れたSQLを生成するために費やす時間は驚くべきものです)、JPAの90〜95%を実行します(必要に応じて関連エンティティの遅延読み込みを含む)。

いくつかの点を修正するだけです。

  • JPAはEJBの永続層であり、EJB上に構築されていません。
  • 適切なJPAプロバイダーは、多くのキャッシングが行われているため、すべてを理解するのは難しい場合があります(これは、「単純性が非常に複雑な理由」の良い例です)。指示していないことをしているのでない限り、管理対象オブジェクトの例外は問題になりません。ランタイム例外は通常、トランザクションをロールバックします(Springのトランザクション管理を使用していて、誰がそれを行わない場合)。プロバイダーは、ロードまたは永続化されたオブジェクトのキャッシュされたコピーを維持します。これは、エンティティマネージャの外部で更新する場合(明示的なキャッシュフラッシュまたはの使用が必要EntityManager.refresh())に問題になる可能性があります。
于 2009-01-05T13:54:06.107 に答える
6

前述のように、JPA <> EJB は関係ありません。EJB 3 はたまたま JPA を利用していますが、それだけです。JPA を使用して、EJB を実行することさえできないものがたくさんあります。

あなたの問題はテクノロジーではなく、あなたのデザインです。

または、あなたのデザインは、ほとんどすべての最新のフレームワークに簡単に適合するとは言えません。

具体的には、いくつかの HTTP リクエストでトランザクションを存続させようとしています。

当然のことながら、ほとんどすべての一般的なイディオムは、各要求がより大きなトランザクションの一部ではなく、各要求自体が 1 つまたは複数のトランザクションであるというものです。

トランザクションは本質的にステートフルであるため、同じ議論で「ステートレス」と「トランザクション」という用語を使用すると、明らかな混乱が生じます。

あなたの大きな問題は、トランザクションを手動で管理することです。

トランザクションが複数の HTTP リクエストで発生しており、それらの HTTP リクエストがたまたま「非常に迅速」に次々と実行されている場合、実際に問題が発生することはありません。データベースのトランザクション機能を利用するために、リクエストは同じ DB 接続を使用しています。

つまり、簡単に言えば、DB への接続を取得し、それをセッションに詰め込み、トランザクションの期間中、すべての HTTP リクエストが同じセッションだけでなく、そのような方法で通過することを確認します。実際の接続がまだ有効であること。具体的には、あるマシンから別のマシンへのフェイルオーバーまたは負荷分散を実際に生き残る既製の JDBC 接続があるとは思えません。

したがって、単純に、DB トランザクションを使用する場合は、同じ DB 接続を使用していることを確認する必要があります。

ここで、長時間実行されるトランザクションに「ユーザー インタラクション」が含まれている場合、つまり、DB トランザクションを開始し、ユーザーが「何かを行う」のを待つ場合、単純に言えば、その設計はすべて間違っています。特にインタラクティブな環境では、長期間存続するトランザクションは単純に悪いだけなので、そうしたくありません。「クロッシング・ザ・ストリーム」のように悪い。やらないでください。バッチ トランザクションは異なりますが、対話型の長期トランザクションは良くありません。

インタラクティブなトランザクションは、実用的である限り短命に保ちたいと考えています。

トランザクションに同じ DB 接続を使用できるかどうかを確認できない場合は、おめでとうございます。独自のトランザクションを実装できます。つまり、バックエンドにトランザクション機能がないかのように、システムとデータ フローを設計できます。

これは基本的に、データを「コミット」するための独自のメカニズムを考え出す必要があることを意味します。

これを行う良い方法は、データを段階的に単一の「トランザクション」ドキュメントに構築し、そのドキュメントを実際の作業の多くを行う「保存」ルーチンにフィードすることです。同様に、データベースに行を保存し、「未保存」のフラグを立てることができます。すべての行でこれを行い、最後に、保存したすべてのデータを実行するルーチンを呼び出し、単一のトランザクション ミニバッチ プロセスですべてを「保存済み」としてマークします。

一方、他のすべての SQL は、「保存」されていないデータを「無視」します。いくつかのタイム スタンプを投入し、リーパー プロセス スカベンジングを実行します (本当に面倒なことをしたい場合は、ボリュームによっては、デッド ローを DB に残しておく方が実際には安価かもしれません)。 「コミットされていない」トランザクション。

それは思ったほど悪くはありません。本当にステートレスな環境が必要な場合は、私にはそう聞こえますが、このようなことをする必要があります。

このすべてにおいて、永続化技術は実際には何の関係もありません。問題は、テクノロジーではなく、トランザクションをどのように使用するかです。

于 2009-01-05T15:32:05.643 に答える
3

「大きな」フレームワークの非常に優れた代替手段であるapachecayenneをご覧になる必要があると思います。適切なモデラーを使用すると、優れたドキュメントによって学習曲線が短縮されます。

于 2009-01-05T15:00:30.717 に答える
2

Ebean ORM(http://www.avaje.org

使用するのがよりシンプルで直感的なORMです。

  • マッピングにJPAアノテーションを使用(@ Entity、@ OneToManyなど)
  • セッションレスAPI-HibernateセッションまたはJPAエンティティマネージャーなし
  • 遅延読み込みは機能します
  • パフォーマンスを向上させるための部分オブジェクトのサポート
  • 「自動フェッチ」による自動クエリ調整
  • 春の統合
  • 大規模なクエリのサポート
  • バッチ処理の優れたサポート
  • バックグラウンドフェッチ
  • DDL生成
  • 必要に応じて生のSQLを使用できます(Ibatisと同じくらい良い)
  • LGPLライセンス

  • ロブ。

于 2009-11-11T11:00:37.513 に答える
2

昨年SimpleORMを見てきましたが、その軽量で魔法のないデザインにとても感銘を受けました。現在、バージョン3があるようですが、私はそのバージョンの経験がありません。

于 2009-01-05T13:58:46.877 に答える
1

BEA Kodo (以前の Solarmetric Kodo) は別の代替手段です。JPA、JDO、および EJ3 をサポートしています。高度な設定が可能で、アグレッシブなプリフェッチ、オブジェクトのデタッチ/アタッチなどをサポートできます。

ただし、あなたが説明したことから、Toplink は問題を処理できるはずです。ほとんどの場合、リクエストの開始時と終了時にオブジェクトを永続レイヤーにアタッチ/デタッチできるようにする必要があるようです。

于 2009-01-05T18:51:56.553 に答える
1

参考までに、OP の設計が彼の最大の問題である理由: 複数のユーザー要求にまたがるトランザクションにまたがるということは、アプリに接続しているユーザーと同じ数のトランザクションを同時に開くことができることを意味します。トランザクションは、コミットされるまで接続をビジー状態に保ちます。 /ロールバック。何千ものユーザーが同時に接続している場合、これは潜在的に何千もの接続を意味する可能性があります。ほとんどのデータベースはこれをサポートしていません。

于 2012-07-27T08:46:51.290 に答える
0

私自身、Hibernateの代替品を探していたときに、Apache2ライセンスのORMであるDataNucleusAccessPlatformに出くわしました。LDAP、DB4O、XMLなどのRDBMS以外のデータソースでもデータの永続性と取得を提供するため、ORMだけではありません。使用経験はありませんが、面白そうです。

于 2009-01-05T23:01:43.273 に答える
0

toxのようなものでパラダイムを完全に破ることを検討してください。Javaクラスが必要な場合は、XML結果をJDOMにロードできます。

于 2009-01-05T23:07:43.650 に答える
0

もう1つのオプションはトルクです。上記のどのオプションよりも優れていると言っているわけではありませんが、それがもう1つのオプションであると言っています。今ではかなり古くなっていますが、いくつかの要件に合うかもしれません。

トルク

于 2009-01-05T14:59:03.357 に答える
0

Hibernate も Toplink (EclipseLink) も EJB ベースではなく、どちらも POJO 永続化フレームワーク (ORM) です。

前の回答に同意します。iBatis は ORM フレームワークの優れた代替手段です。SQL を完全に制御し、優れたキャッシュ メカニズムを備えています。

于 2009-01-05T14:37:31.650 に答える