在不使用关系数据库的情况下,使用Java存储和检索对象的简便方法?

时间:2009-01-14 16:10:26

标签: java persistence relational

您是否知道在Java 中存储和检索对象的“简单”方法,而不使用像Hibernate这样的关系DB / ORM

[请注意,我没有考虑为此目的进行序列化,因为它不允许在对象图的中间检索任意对象。我也不考虑DB4O,因为它有限制性许可。感谢。

“简单”含义:不必处理诸如键/值对之类的低级细节来重建对象图(与BerkeleyDB或传统缓存一样)。这同样适用于从面向文档或列的DB(CouchDB,HBase,......,甚至Lucene)重建对象。

也许有一些有趣的项目提供了我所不知道的所提到的存储系统和对象模型之间的集成层(就像ORM将用于RDBMS)。

是否有人成功地在生产中使用这些,或者尝试除关系数据库之外的持久性策略? RDF商店怎么样?

更新:我发现了一篇非常有趣的文章:A list of distributed key-value stores

9 个答案:

答案 0 :(得分:5)

我建议使用Hibernate,因为它会处理大多数丑陋的细节,这些细节会让开发人员在使用数据库时陷入困境,同时仍然允许多年来对数据库软件进行的优化。

答案 1 :(得分:3)

NeoDatis看起来很有趣。它是根据LGPL许可的,因此不像GLP本身那样具有限制性。

查看他们的1 minute tutorial,了解它是否适​​合您的需求。

答案 2 :(得分:2)

我想推荐XStream,它只需要你的POJO并从中创建XML,这样你就可以将它存储在磁盘上。它非常易于使用,也是开源的。

答案 3 :(得分:1)

我建议像Matt一样使用Hibernate(或者更通用的OR映射),但是后端还有一个RDBMS,我不太清楚你的意思

  

...没有使用关系数据库?...

了解有关应用程序的更多信息也很有趣,因为OR映射并不总是一个好主意(开发性能与运行时性能)。

编辑:我很快就了解了兵马俑,并且有一个很好的stackoverflow讨论here关于用该工具替换DB。仍然是实验性的,但值得一读。

答案 4 :(得分:1)

我仍然认为你应该考虑支付db4o

如果您还想要其他内容,请在标题中添加“使用MIT样式的许可证”。

答案 5 :(得分:0)

this question上查看对Prevayler的评论。 Prevayler是一个围绕对象序列化的事务包装器 - 粗略地说,使用普通java中的对象并通过java API w / o sql持久保存到磁盘,比编写自己的序列化要简单。

警告 - 将序列化作为持久性机制,您在更新类时可能会使保存的数据失效。即使使用包装器库,您也可能希望自定义序列化/反序列化处理。它还有助于在类中包含serialVersionUID,因此您可以覆盖JVM关于何时更新类的想法(因此无法重新加载已保存的序列化数据)。

答案 6 :(得分:0)

嗯...没有序列化,没有ORM解决方案,我会回到某种基于XML的实现?如果你只想从对象图中提取一些对象,你仍然需要仔细设计它 - 对于每个对象可能是一个不同的文件,其中对象关系被一个URI引用到另一个文件?

我会说这不是“简单”因为我总是发现设计XML到对象的映射有点耗费时间,但我真的受到Apache Betwixt上的对话的启发,让我感到有希望我刚刚过时,现在可以使用更简单的解决方案。

答案 7 :(得分:0)

Terracotta提供高度可用,高度可扩展的持久性磁盘对象存储。您可以单独使用它 - 或者您可以使用它的广泛功能来实现完全集群的应用程序 - 您的选择。

陶土:

  • 不会破坏对象标识,为您提供最自然的编程接口
  • 不需要序列化
  • 集群(并持久化)几乎所有Java类(Maps,Locks,Queues,FutureTask,CyclicBarrier等)
  • 以内存速度将对象持久保存到磁盘
  • 仅移动对象增量,提供非常高的性能

Here's a case study about how gnip使用Terracotta进行内存中持久性 - 没有数据库。 Gnip接收Facebook,Twitter等所有活动,并以规范化的方式为消费者制作。他们目前的解决方案是处理超过50,000条消息/秒。

它是OSS,与许多其他第三方框架(包括Spring和Hibernate)高度集成。

答案 8 :(得分:0)

我想我已经找到了一个问题的答案。

当您始终根据关系,规范化和连接方式考虑数据时,获取面向文档的范式思维并非易事。

CouchDB似乎符合要求。它仍然可以充当键值存储,但它的强大查询功能(映射/缩减,查看排序规则),并发准备和与语言无关的HTTP访问使它成为我的选择。

只有小故障必须将JSON结构定义并映射到对象,但我相信我会想出一个简单的解决方案,用于Java和Scala的关系模型(后来担心缓存,因为争用是离开了数据库)。 Terracotta仍然有用,但肯定不像RDBMS场景那样。

感谢大家的投入。