关于ORM + RDBMS替代方案的想法?

时间:2009-01-06 21:01:19

标签: java database persistence

我目前正在为替代数据存储开发概念验证。我之所以需要增强一个主要是读取群集的webapp,还因为我想摆脱有时overly-complex ORM+RDBMS solution的痛苦。

总的来说,这个想法非常类似于具有持久性的分布式缓存 (让集群成为SoR),但是:

  • 希望能够通过以下方式检索任何对象及其子对象 id(提供class& id)[仅限于开始,作为主要 查询部分已经在我的应用程序中使用lucene解决了。
  • 需要有类型地图的地图(〜关系中的表格 世界),并在其中分发'脱水'存储对象的地图(通过反射深度克隆展平对象图)
  • bin日志(例如Prevayler)
    • 如果整个群集出现故障,最终将恢复
    • 开发(以及重构代码/更改结构的能力)
    • 可能为了其他目的而异步处理(报告,无论如何)
  • 最后在尝试集成静态类型的查询机制,如LINQ,Jaque或H2的JaQu /看ODBs / Lucene(?)
  • 它必须是交易感知的(不确定“JTA类型”)

我打算用Hazelcast(我喜欢它超级简单的API)或Terracotta(我从未使用过 - 但我知道他们的'甜蜜点',中期数据)来实现这个想法。如果你愿意,我的目标是做更多或更少what Jonas once blogged about。使用其中一个,存储的数据大致必须适合集群的JVM堆的总和。

这应该非常简单,可以避免关系阻抗不匹配(即与ODB一样保存)和JDBC + I / O开销。

您是否知道已经提供类似功能的其他工具/框架或其组合,我忽略了? 你能否提出其他方法来解决这个“摆脱数据库”的问题?你在这个想法中已经看到了什么缺陷? 并发性是否考虑Scala而不是Java?

如Couch DB,Neo4j,HyperTable,HBase等非关系型数据存储怎么样?

一个月前曾问过similar question - 但没有具体的解决方案。

BTW我偶然发现Enterprise Data Fabric的概念,令我惊讶的是,它描述了很多这些想法。

6 个答案:

答案 0 :(得分:2)

一定要试试Terracotta。它是免费的(除非你去拥有SLA和支持的Enterprise)。它是一个JVM级别的集群,可以这么说,所以你没有与不同JK工作者背后的多个框上的会话相关的问题(假设你将它用于J2EE应用程序)。

我只是漫无目的,所以看看这里:http://en.wikipedia.org/wiki/Terracotta_Cluster

更新关于网上Terracotta的大量信息,例如http://blog.terracottatech.com/2007/12/fud_of_the_week_terracotta_doe.html

UPDATE2 我的观点背景:我为一家拥有相当多观众的公司工作。我们有一个使用主服务器运行的企业MySQL和大约5个从服务器(考虑到我们有2个通道,每个通道有4个app服务器),使用MySQL的JDBC Replication驱动程序(我们已经提交了各种补丁)。我们使用Spring的声明性JTA事务管理来使用Spring2.5 / Hibernate3,因此read-onlies会转到slave。随着我们网站未来版本的众多Ajax增强功能的出现,我们的数据库服务器的负载已经增加 - 我们为所有国家的数千种产品创建定价摘要,同时考虑了所有这些国家的关税/税收规则(以及促销活动)和实时拍卖一直运行),然后Ajax服务眨眼间有最新的价格。通过将这些价格提供给JVM层上的所有应用服务器,Terracotta可以减轻数据库和应用服务器的负担,并且所有JVM都可以链接在一起。因此,服务器A可以每隔几分钟更新一次价格,如果Ajax点击服务器B,价格立即可用。我知道有些人/公司有类似的业务,可能有更好的想法和实施,所以我总是开放讨论,但这是我的两分钱。

我也从Facebook上的人那里获得灵感,例如这篇内容非常丰富的文章: http://www.facebook.com/note.php?note_id=23844338919

他们谈论memcached,你也应该检查一下。

答案 1 :(得分:2)

问题中提到了Neo4j,在这种情况下,我想到了一些关于使用图形数据库的想法。 (我是Neo4j团队的一员)

  • 检索孩子是微不足道的 图db
  • 有一个map implementation 对于neo4j
  • 因为图表是图表db的原生图 你可以考虑不要压扁 对象图,但要在节点中保留数据 和边缘/关系(这给你 更灵活地处理数据)
  • neo4j是完全交易的

随着今天出现的新数据库技术的出现,如果您的数据不适合关系范例,则无需继续使用RDBMS。

答案 2 :(得分:2)

对我来说,Terracotta非常适合您的要求:

  • 群集地图以检索子项 通过密钥(例如聚集地图)
  • 地图地图 - 没问题
  • 没有明确的bin日志 - 但是Terracotta已经将所有内容保存到磁盘,因此已经支持完全集群重启
  • 已集成到Compass,Hibernate Search和Lucene进行搜索
  • 交易?太慢了。将缓存用作数据存储区。使用持久性,您不会丢失写入(集群)内存的数据并返回到数据库。

此外,Terracotta会做你要求的“反思” - 尽管它不使用反射,因为它太慢了。它使用BCM。只有更改才会在网络上传播。

Hazelcast btw需要序列化,所以它会很慢并且根本不会很好地使用地图数据结构地图(每次放置将导致整个网络上的完整深度克隆副本)并且它没有任何类型的内置的持久性。

答案 3 :(得分:1)

有趣。

我认为我们都开发了一个动物园,它包含了我们习惯在项目中使用的所有抽象层。每个抽象层都是完全不同的动物。

我的目标是尽量减少动物护理和喂食所花费的时间,只要它让我解决手头的问题 - 这是开销 - 浪费的资源。因此,我们可以使用的更少,更简单的抽象层,我们的生产力越高。

我通常可以通过两个小动物--OOP和RDBMS来完成,通过漂亮,简单,最小化,手工制作的DAL进行耦合。对我来说,ORM主要是开销 - 一个抽象太多,而且非常饥饿。

不要忽视将存储过程视为抽象工具的选项。如果您对SQL非常熟悉,它可以成为实现轻量级BL外观的有用资源,这意味着无需考虑ORM问题。

这篇文章表明,无论如何,RDBMS的替代品都出现了一些要求。

答案 4 :(得分:0)

感谢您的回答。

实际上,你谈论的是DBs,这是我想要从图片中完全取出的东西。

我目标的用例是初创公司的中小型集群webapp(局域网或云端的盒子)。它需要以~RAM速度级别检索对象并相当容易地扩展。作为副作用,人们不必考虑数据库服务器安装,阻抗不匹配,JDBC,缓存,带注释的污染域模型等。

同样,我想要完成的是here所描述的内容,我希望对实际实施的想法有更多的反馈(为什么使用Terracotta而不是Hazelcast,使用序列化或通过反射深度克隆或者其他什么,以及像这样的方法的主要缺点 - 例如,为什么你不能为当前的ORM / DB设置改变它。

集成非常简单,因此它具有非常简洁的Java API,提高了代码的可读性。没有其他软件(DB,需要memcached)。

答案 5 :(得分:0)

试试GigaSpaces。我认为他们完全符合您的要求,如果我没弄错的话,那里有创业公司的免费版本。

一些概念:

  • “空间”是您可以存储和检索对象的地方
  • 任何符合JDBC的DB都可以自动支持空间(无代码,仅配置)
  • 可以在java进程中启动空间,因此所有访问都以RAM速度
  • 可以任何方式对空间进行聚类/分区(全镜像,部分,网格)。
  • Space支持分布式或本地事务

检查他们的wiki,(但只有“程序员指南” - 其余的都是营销BS)。