2012-03-01 7 views
3

Object persistence strategy for desktop applicationこれだけで一つの他の質問を見つけることができました)。私はこれらの基本的なクエリを実行する必要があります。は、持続性戦略スタンドアロン用デスクトップJavaアプリケーションは

私はJPA-Hibernate + HSQLDBを見ましたが、これはアプリケーションの起動時間を遅くし、クエリの要件が過大であると考えました。

私はデータモデルを単純化し、ドキュメントDBを見始めました - mongodbは素晴らしいですが、非サーバ環境には本当に適していません。 ProcessBuilderを使ってJavaからmongodプロセスを起動してシャットダウンするのは面倒なことです。私は本当に組み込み型ソリューションを望んでいます。

Javaアプリに組み込むことのできる基本的なクエリ機能を備えた、高速で軽量な永続性ツールが本当に必要です。

これらは唯一のオプションですか?

  • JSONをファイルシステムにORM
  • Javaのシリアライズなし

    他のアドバイスや提案はありますか?どの時点でPOJOの大規模なリストを直列化すると、実際にパフォーマンスを傷つけることになりますか?

    おかげ

    編集:ちょうどこの記事を見つけた - https://stackoverflow.com/questions/2825491/are-there-any-embeddable-document-database-engines-for-java-something-similar-tオリエントを推薦 - http://code.google.com/p/orient/

  • +3

    サイドノート:一般に、この種の問題については、HSQLDBよりH2を推奨します。 – Viruzzo

    +0

    私は2,3年前にプロジェクトでH2を使用しました。シンプルさとセットアップのしやすさが大好きです。 – jere

    +0

    私はOrientDBの文書データベースとこれまでのところよく適合しています。 –

    答えて

    1

    私は最近、スタンドアロンのデスクトップアプリケーションのためのデータストアとしてdb4oの(http://www.db4o.com/)を使用。そのオブジェクトデータベースは、バックグラウンドで実行されているサーバーを使わずに組み込みモードで実行できます。

    +0

    ありがとう - 私はこれを見ましたが、理想的にはもっと軽量なものがほしいと思っています。 –

    1

    軽量化を望むなら、間違いなくJCRは必要ありません。 APIは煩雑で、パフォーマンスは一般的に他のオプションより劣ります。 JCRには、必要な場合にはこれらの欠点を上回る強力な機能がいくつかありますが、そうでないように思えます。

    1

    私は、何らかの種類のリポジトリオブジェクトに永続性操作をカプセル化することをお勧めします。したがって、将来的に実装を変更すると、やることが少なくなります。あなたは、のように見えるインターフェイスを構築、文書の観点から考える、または(「顧客ファイル」、「保存したゲーム」、「開発プロジェクト」)に関連するオブジェクトをグループ化する他の方法ができた場合:

    public interface DocumentRepository { 
        public Document create(); 
        public Document load(String id); 
        public void update(Document doc); 
        public Set<Document> findByCustomerNameFreeTextSearch(String query); 
    } 
    

    ことさまざまなバックエンドの上に実装可能でなければなりません。

    第2に、私は最初にこれを単純な古いシリアル化で実装します。次のようなものがあります。

    public class SerializingDocumentRepository implements DocumentRepository { 
        private final File persistenceDir; 
    
        public Document create() { 
         return new Document(); 
        } 
    
        public Document load(String id) { 
         ObjectInputStream in = new ObjectInputStream(persistenceDir, new File(id)); 
         try { 
          return (Document)in.readObject(); 
         } 
         finally { 
          in.close(); 
         } 
        } 
    
        public void update(Document doc) { 
         ObjectOutputStream out = new ObjectOutputStream(persistenceDir, new File(id)).writeObject(doc); 
         try { 
          out.writeObject(doc); 
         } 
         finally { 
          in.close(); 
         } 
        } 
    
        public Set<Document> findByCustomerNameFreeTextSearch(String query) { 
         Set<Document> hits = new HashSet<Document>(); 
         for (String filename: persistenceDir.list()) { 
          Document doc = load(filename); 
          if (doc.getCustomer().getName().contains(query)) hits.add(doc); 
         } 
         return hits; 
        } 
    } 
    

    例外処理の場合のみです。

    この実装は非常に簡単に記述する必要があります。非常に高速ではないかもしれませんが(少なくとも検索するために)、アプリケーションの残りの部分を書くのに十分速いでしょう。アプリケーションの残りの部分を書いたら、永続性についてより良い選択をするために十分なデータを生成することができます。

    +0

    ヒントありがとうございました。私はもともとバネデータJPAとジェネリックDAO実装を使用していました。 –

    関連する問題