独立桌面Java应用程序的持久性策略

时间:2012-03-01 11:41:05

标签: java swing persistence

(只设法找到另一个问题 - Object persistence strategy for desktop application

我有一个基本的Java Swing应用程序 - 需要访问/持久存在几千个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推荐Orient - http://code.google.com/p/orient/

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

如果你想要轻量级,你肯定不想要JCR。 API很麻烦,性能通常比其他选项差。 JCR有一些强大的功能,如果你需要它们会超过这些缺点,但听起来你没有。

答案 2 :(得分: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;
    }
}

仅限异常处理。

编写实现应该非常非常简单。它可能不会非常快(至少用于搜索),但它足够快,可以让你编写应用程序的其余部分。一旦你编写了应用程序的其余部分,你就能够生成足够的数据,以便能够更好地选择持久性。

相关问题