11

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

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

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

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

任何人成功地在生产中使用它们,或者尝试使用关系数据库以外的持久性策略?RDF 商店怎么样?

更新:我遇到了一篇非常有趣的文章:分布式键值存储列表

4

9 回答 9

5
  • 对象序列化(也就是将东西存储到文件中)
  • Hibernate(使用关系数据库,但对开发人员相当透明)

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

于 2009-01-14T16:17:30.750 回答
2

NeoDatis看起来很有趣。它是根据 LGPL 获得许可的,因此不像 GLP 本身那样严格。

查看他们的1 分钟教程,看看它是否适合您的需求。

于 2009-01-14T16:32:36.510 回答
2

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

于 2009-01-14T16:58:27.440 回答
1

我会推荐像马特这样的 Hibernate(或更一般地说,OR-mapping),但后端也有一个 RDBMS,我不太清楚你的意思

...不使用关系数据库?...

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

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

于 2009-01-14T16:22:58.243 回答
1

我仍然认为您应该考虑为db4o付费。

如果您想要其他内容,请在标题中添加“with an MIT-style license”。

于 2009-01-14T17:34:47.443 回答
0

查看 Prevayler对此问题的评论。Prevayler 是一个围绕对象序列化的事务性包装器——粗略地说,在纯 java 中使用对象并通过没有 sql 的 java API 持久化到磁盘,比编写自己的序列化更简洁。

注意事项 - 将序列化作为一种​​持久性机制,您在更新类时冒着使保存的数据无效的风险。即使使用包装库,您也可能希望自定义序列化/反序列化处理。它还有助于在类中包含 serialVersionUID,这样您就可以覆盖 JVM 关于何时更新类的想法(因此无法重新加载您保存的序列化数据)。

于 2009-01-14T16:25:55.913 回答
0

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

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

于 2009-01-14T16:49:59.953 回答
0

Terracotta 提供了一个高度可用、高度可扩展的持久磁盘对象存储。您可以仅将它用于此功能 - 或者您可以使用它的广泛功能来实现完全集群的应用程序 - 您的选择。

红陶:

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

这是一个关于 gnip 如何使用 Terracotta 进行内存持久性的案例研究 - 没有数据库。Gnip 接收 Facebook、Twitter 等网站上的所有事件,并以标准化的方式为消费者制作它们。他们目前的解决方案是每秒处理超过 50,000 条消息。

它是 OSS,并与许多其他 3rd 方框架高度集成,包括 Spring 和 Hibernate。

于 2009-02-17T08:21:34.960 回答
0

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

当您一直从关系、规范化和连接方面考虑您的数据时,获得面向文档的范式思维方式并非易事。

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

唯一的问题是必须正确定义 JSON 结构并将其映射到对象,但我相信我会想出一个简单的解决方案来使用 Java 和 Scala 的关系模型(并且稍后担心缓存,因为争用已从数据库)。Terracotta 仍然有用,但肯定不像 RDBMS 场景那样有用。

谢谢大家的意见。

于 2009-03-01T23:01:46.773 回答