2012-03-01 40 views
3

(只能设法找到这一个的其他问题 - Object persistence strategy for desktop application)我有一个基本的Java Swing应用程序持久化策略进行单机桌面Java应用程序

- 这需要访问/持续几千年的POJO。我可能需要对这些进行基本查询。

最初我看了JPA-Hibernate + HSQLDB,但是这会减慢应用程序的启动时间,我认为这对我的查询需求来说是过度的。

我简化了我的数据模型,并开始查看文档数据库--mongodb很棒,但它并不适合非服务器环境;启动和关闭从Java(使用ProcessBuilder)的mongod进程是很烦琐的,我真的想要一个嵌入式解决方案。

我真的很想拥有一个快速,轻量级的持久化工具,它具有可嵌入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

附注:我通常会建议H2比HSQLDB更适合这类问题。 – Viruzzo 2012-03-01 13:16:27

+0

几年前,我在一个项目中使用了H2。一定要喜欢它的简单和易于安装。 – jere 2012-03-02 12:45:54

+0

我已经开始使用OrientDB的文档数据库,目前它已经很适合。 – 2012-03-02 14:32:32

回答

1

我最近使用了db4o(http://www.db4o.com/)作为一个独立的桌面应用程序的数据存储。它的对象数据库可以在嵌入式模式下运行,而不需要在后台运行服务器。

+0

谢谢 - 我看了这个,但理想情况下想要更轻量级 – 2012-03-01 22:23:11

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); 
} 

那应该可以在各种后端之上实现。

其次,我会初步实现这与简单的旧序列化。例如:

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实现是一个大抽奖。 – 2012-03-02 14:30:18