Struts2を使用してGoogleAppEngineでプロジェクトを開発したいと思います。データベースには、JPAとJDOの2つのオプションがあります。提案してくれませんか?どちらも私にとっては新しいものであり、私はそれらを学ぶ必要があります。だから私はあなたの返事の後に1つに焦点を当てます。
ありがとう。
回答:
JPAはSunの永続性の標準であり、JDOは私見で死にかけています(実際には、死んでいますが、まだ動いています)。言い換えれば、JPAは長期的にはより良い投資であるように思われます。ですから、両方が初めての場合は、JPAを選択すると思います。
GAE / Jグーグルグループは、まさにこのことについていくつかの投稿をしています。そこで検索して、人の意見を見てみます。あなたは上記の意見とは非常に異なるメッセージを受け取るでしょう。BigTableはRDBMSではないという事実にも注目してください。仕事に適したツールを使用する
- :ちょうどDataNucleusの単独でのJPAとJDOの間のこの比較を見 http://www.datanucleus.org/products/accessplatform_2_1/jdo_jpa_faq.html 目を見張るを。
JDOが死んだと主張する人々にはメリットがないわけではありません。Pro EJB 3 Java Persistence APIの本で私が読んだものは次のとおりです。「その後まもなく、Sunは、JDOが仕様保守モードに縮小され、Java Persistence APIがJDOと他の永続性ベンダーの両方から取得され、単一のサポートになることを発表しました。今後の標準。」著者のMikeKeithは、EJB3の共同仕様リーダーです。もちろん、彼はJPAの大きな支持者ですが、嘘をつくほど偏見があるとは思えません。
JDOはJPAよりも高度な技術的機能を備えていますが、本が出版されたとき、ほとんどの主要ベンダーはJDOではなくJPAの背後で団結していたことは事実です。IBM / OracleなどのEEの世界の大手企業も、RDBMSの大手ベンダーであるため、当然のことです。プロジェクトで非RDMBSよりも多くの顧客がRDMBSを使用しています。JDOは、GAEが大きな後押しをするまで死にかけていました。GAEデータストアはリレーショナルデータベースではないため、これは理にかなっています。一部のJPA機能は、集計クエリ、結合クエリ、所有する多対多の関係など、bigtableでは機能しません。ところで、GAEはJDO 2.3をサポートしますが、JPA1.0のみをサポートします。GAEがターゲットクラウドプラットフォームである場合は、JDOをお勧めします。
ちなみに、これはGoogle App Engine(GAE)であるため、Oracle / SunのルールではなくGoogleのルールを使用します。
その下では、JPAはGAEに適さず、不安定であり、期待どおりに機能しません。どちらのグーグルもそれをサポートするつもりはありませんが、最低限です。
そして他の部分については、JDOはGAEで非常に安定しており、(ある程度)Googleによって十分に文書化されています。
ただし、Googleはそれらのいずれも推奨していません。
http://code.google.com/appengine/docs/java/datastore/overview.html
低レベルのAPIは最高のパフォーマンスを提供し、GAEはパフォーマンスがすべてです。
たとえば、10個のエンティティを追加します
Python:68ms
JDO:378ms
Java Native:30ms
JDOとJPAの間の競争では、datanucleusのポスターにしか同意できません。
まず第一に、そしてまた最も重要なことに、datanucleusの投稿者は彼らが何をしているのかを知っています。結局のところ、彼らは永続的なライブラリを開発しており、リレーショナル以外のデータモデル(Big Tableなど)に精通しています。hibernateの開発者がここにいたと確信しています。「コアライブラリを構築する際のすべての仮定はリレーショナルモデルと緊密に結合されており、hibernateはGAE用に最適化されていません」。
第二に、JPAは間違いなくより広く使用されており、公式のJava EEスタックの一部であることが少し役立ちますが、それが必ずしも優れているとは限りません。実際、JDOについて読んだ場合、JPAよりも高いレベルの抽象化に対応します。JPAは、RDBMSデータモデルと緊密に結合されています。
プログラミングの観点からは、JDO APIを使用する方がはるかに優れたオプションです。これは、概念的に妥協することがはるかに少ないためです。使用するプロバイダーが基盤となるデータベースをサポートしている場合は、理論的には任意のデータモデルに切り替えることができます。(実際には、GAEのオブジェクトに主キーを設定し、Googleなどの特定のデータベースプロバイダーに自分自身を結び付けるため、このような高レベルの透明性を実現することはめったにありません)。ただし、移行はさらに簡単になります。
第三に、Hibernate、Eclipse Link、さらにはGAEでSpringを使用できます。Googleは、アプリケーションの構築に使用したフレームワークを使用できるようにするために多大な努力を払ったようです。しかし、GAEアプリケーションをRDBMSで実行しているかのように構築するときに人々が気付くのは、速度が遅いということです。GAEの春は遅いです。このトピックに関するGoogleIOビデオをグーグルで検索して、それが真実であることを確認できます。
また、基準を遵守することは賢明なことであり、原則として私は称賛します。一方、Java EEスタックの一部であるJPAにより、人々はオプションの概念を失うことがあります。必要に応じて、Java ServerFacesもJavaEEスタックの一部であることを認識してください。そして、それはWebGUI開発のための信じられないほどきちんとしたソリューションです。しかし、結局のところ、なぜ人々、つまり賢い人々がこの標準から逸脱し、代わりにGWTを使用するのでしょうか。
これらすべてにおいて、JPAにとって非常に重要なことが1つあることを述べなければなりません。それがGuiceとJPAの便利なサポートです。グーグルはこの時点でいつもほど賢くなく、今のところJDOをサポートしていないことに満足しているようです。私はまだ彼らがそれを買う余裕があると思います、そして最終的にギスはJDOも飲み込むでしょう...または多分そうではありません。
これをJDO
書いている時点で使用することについて私がひどいと思うのは、唯一の実装ベンダーでDatanucleus
あり、その欠点は次のような多くの問題につながる競争の欠如です。
extensions
StackOverflow
私は常に誰かがJDO
仕様を自分で実装し始めることを望んでいます、そうすれば彼らはコミュニティにもっともっとそしてうまくいけばもっと自由な注意を提供し、Datanucleus
著者が商業的サポートだけを気にかけていると言っているのではなく、常にサポートの支払いを気にする必要はありません、しかし私はただ言っているだけです。
私は個人的に、Datanucleus
作者はDatanucleus
それ自体やそのコミュニティに対して何の義務も負わないと考えています。彼らはいつでもプロジェクト全体を落とすことができ、誰もそれを判断することはできません。それは彼らの努力と彼ら自身の財産です。しかし、あなたは自分が何に入っているのかを知っているべきです。ご覧のとおり、私たちの開発者の1人が使用するフレームワークを探すとき、フレームワークの作成者を罰したり命令したりすることはできませんが、その一方で、作業を完了する必要があります。そのフレームワークを書く時間があったら、そもそもなぜフレームワークを探すのでしょうか?!
一方、JDO
それ自体には、オブジェクトのライフサイクルや、あまり直感的で一般的ではないものなど、いくつかの問題があります(私は思います)。
編集:JPA
オブジェクトライフサイクルメカニズムも適用されることがわかったので、標準のORM API(つまりJPA
またはJDO
)を使用する場合は、永続化されたエンティティのライフサイクル状態を処理することが避けられないようです。
私が最も気に入っているのJDO
は、かなりの労力をかけずに任意のデータベース管理システムを操作できることです。
GAE / Jは、年末までにMYSQLを追加する予定です。
JPAは、標準化されたAPIとしてプッシュされているようで、最近EJB3.0で勢いを増しているため、進むべき道です。JDOは勢いを失ったようです。
どちらでもない!
Objectifyを使用します。これは、より安価で(より少ないリソースを使用)、より高速であるためです。参考:http://paulonjava.blogspot.mx/2010/12/tuning-google-appengine.html
Objectifyは、Google AppEngineデータストア用に特別に設計されたJavaデータアクセスAPIです。それは「中間」を占めます。JDOやJPAよりも使いやすく、透過的ですが、低レベルAPIよりもはるかに便利です。Objectifyは、初心者がすぐに生産的になると同時に、GAEデータストアの全機能を公開するように設計されています。
Objectifyを使用すると、独自の型指定されたオブジェクトを永続化、取得、削除、および照会できます。
@Entity
class Car {
@Id String vin; // Can be Long, long, or String
String color;
}
ofy().save().entity(new Car("123123", "red")).now();
Car c = ofy().load().type(Car.class).id("123123").now();
ofy().delete().entity(c);