【问题标题】:Persistence Strategy for Standalone Desktop Java Application独立桌面 Java 应用程序的持久性策略
【发布时间】:2012-03-02 20:42:33
【问题描述】:

(仅设法找到关于此的另一个问题 - Object persistence strategy for desktop application

我有一个基本的 Java Swing 应用程序 - 它需要访问/持久化几千个 POJO。我可能需要对这些运行基本查询。

最初我查看了 JPA-Hibernate + HSQLDB,但这会减慢应用程序的启动时间,而且我认为这对于我的查询要求来说是多余的。

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

我真的想要一个快速、轻量级的持久性工具,它具有可以嵌入到 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/

【问题讨论】:

  • 旁注:对于这类问题,我通常会推荐 H2 而不是 HSQLDB。
  • 几年前我在一个项目中使用了 H2。一定会喜欢它的简单性和易于设置。
  • 我已经开始使用 OrientDB 的文档数据库,到目前为止它非常适合。

标签: java swing persistence


【解决方案1】:

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

【讨论】:

  • 谢谢 - 我看过这个,但理想情况下想要更轻量级的东西
【解决方案2】:

如果你想要轻量级,你肯定不想要 JCR。 API 比较繁琐,性能一般比其他选项差。 JCR 有一些强大的功能,如果您需要它们,它们会胜过这些缺点,但听起来您不需要。

【讨论】:

    【解决方案3】:

    首先,我建议您将持久性操作封装在某种存储库对象中,因此如果您将来更改实现,您将有更少的工作要做。如果您可以根据文档或其他方式对相关对象进行分组(“客户文件”、“保存的游戏”、“开发项目”),那么构建一个如下所示的界面:

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

    仅用于异常处理。

    那个实现应该非常非常容易编写。它可能不是非常快(至少对于搜索而言),但它的速度足以让您编写应用程序的其余部分。编写完应用程序的其余部分后,您将能够生成足够的数据,以便能够对持久性做出更好的选择。

    【讨论】:

    • 感谢提示 - 我最初使用的是 spring-data JPA,他们拥有的通用 DAO 实现非常吸引人。
    猜你喜欢
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 2019-04-18
    • 2012-11-01
    相关资源
    最近更新 更多