0

我遇到了 db4o OODB 数据库,想知道它与带有 RDBMS 或像 Hibernate/EclipseLink 这样的 ORM 的传统堆栈相比如何。该应用程序是一个工作流系统,并将随着时间的推移而扩展。不确定像 db4o 这样的 OODB 是否适合。我从来没有在 OODB 上工作过,所以我不知道。有什么建议么?

4

2 回答 2

2

你好!下面是一些基于我自己的 DB4O 经验的信息。

如今,所谓的 OODB(面向对象的数据库)有很多选择。我可以告诉您与使用常规 RDBMS 相比,它是如何工作的,而不是编写这些类似解决方案的列表,因为那是您的实际问题。

您可以在 Wikipedia 上阅读一些最常用的系统的相当不错的比较: OODB 的比较

如果您将 ORM 持久化方法与 NHibernate 之类的工具一起使用,那么在查询和更新持久化对象背后的数据库时,您会更加轻松。您可以将 NHibernate 之类的工具视为“混合”解决方案,而使用您提到的纯对象数据库(我自己做过一些工作)来自 Versant / Actian 的 DB4O,您可以选择直接使用文件在文件系统上或选择客户端/服务器解决方案。DB4O 支持两者。

最常见的场景可能是前面提到的场景,您将使用本地系统上的文件来保存应用程序对象的持久副本。

DB4O 现在作为非商业用途的免费产品存在,并且具有 Java 和 .Net 版本。它们的工作方式相同,根据我的个人经验,它们对于从简单的2-10 兆字节数据库到重约 10-12 GB 的文件都非常适用。

根据 DB4O 开发人员的经验,如果您预计应用程序的数据库需要大于 15-16 GigaBytes 左右,您应该考虑其他方法。

DB4O 是单线程的,因此需要一个相当快速的 CPU 内核来处理大量事务。但是,考虑到这个明显的限制,它设法运行得非常好。

DB4O 易于扩展,应该可以满足面向对象数据库的大部分需求。

这是一个简短的示例,它显示了连接一系列自定义对象并将其写入从我自己的一个项目中获取的数据库是多么容易:(DbPath 是一个字符串常量)

public static void StoreObjectsToDb(IEnumerable<SyncObject> syncObjects)
  {
     using (IObjectContainer container = Db4oEmbedded.OpenFile(DbPath))
     {
        try
        {
           foreach (var hdSyncObject in syncObjects)
           {
              container.Store(hdSyncObject);
              Console.WriteLine("Stored Object with HdID {0}\t<-->\tTfsID {1} to database.",hdSyncObject.HdId,hdSyncObject.HdTfsNo);
           }
           container.Commit();
           LogUtility.WriteToLog("Successfully wrote all objects to database.");
        }
        catch (Exception ex)
        {
           container.Rollback();
           LogUtility.WriteToLog("Could not save objects to database. Rolling back changes...\nError: {0}",ex.Message);
        }
        finally
        {
           container.Close();
        }
     }
  }

如您所见,有一种非常简单的方法可以创建一个新数据库并用对象填充它,而无需在类定义本身中使用任何形式的序列化代码。

许多 OODB 都支持许多传统的 RDBMS 功能,并且在某些情况下,实现常规 SQL 数据库的开销比简单地将数据库直接嵌入到源中要大得多。

希望这能澄清一点。

克里斯

于 2013-09-20T14:12:37.453 回答
0

对于更大的应用程序,Gemstone(一种持久的小型谈话)更适合。这很容易扩展到单台机器支持的最大内存(2/4 TByte?)。在 Gemstone 中,您通常不会进行非规范化以获得最佳性能。

于 2019-05-08T14:24:22.027 回答