(只设法找到另一个问题 - 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/
答案 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;
}
}
仅限异常处理。
编写实现应该非常非常简单。它可能不会非常快(至少用于搜索),但它足够快,可以让你编写应用程序的其余部分。一旦你编写了应用程序的其余部分,你就能够生成足够的数据,以便能够更好地选择持久性。