我遇到了db4o OODB数据库,想知道它与传统的RDBMS堆栈或Hibernate / EclipseLink等ORM的比较。 该应用程序是一个工作流程系统,并将随着时间的推不确定像db4o这样的OODB是否适合。我从来没有在OODB上工作,所以我说不出来。 有什么建议吗?
答案 0 :(得分:2)
嗨!以下是一些基于我自己DB4O经验的信息。
目前,所谓的OODB(面向对象数据库)有很多选择。 我没有写出这些类似解决方案的列表,而是告诉你它是如何工作的,而不是使用常规的RDBMS,因为这是你的实际问题。
您可以阅读维基百科上一些最常用系统的相当不错的比较: Comparison of OODB's
如果你使用像NHibernate这样的工具使用ORM持久性方法,那么在查询和更新持久化对象后面的数据库时,你会给自己一个更轻松的时间。 您可以将NHibernate这样的工具看作是一个“混合”解决方案,而像您提到的纯对象数据库(我已经完成了一些自己的工作)来自Versant / Actian的DB4O您可以选择直接使用文件在文件系统上或选择客户端/服务器类型的解决方案。 DB4O支持两者。
最常见的情况可能是前面提到的场景,您可以使用本地系统上的文件来保留应用程序对象的持久副本。
DB4O现在作为免费的非商业用途产品存在,并且具有Java和.Net版本。它们的工作方式相同,从我个人的经验来看,它们的工作非常好,从简单的 2-10 Mega-Byte数据库到大约10-12 GB的文件。
根据经验,根据DB4O开发人员的说法,如果您希望应用程序的数据库需要大于15-16 GigaBytes,那么您应该考虑其他方法。
DB4O是单线程的,因此需要相当快速的CPU Core来处理大量事务。但是,考虑到这个明显的限制,它能够很好地运行。
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数据库的开销远比简单地将数据库直接嵌入源代码要大。
希望这可以解决一些问题。
克里斯
答案 1 :(得分:0)
对于某些较大的应用程序,Gemstone(持久性小谈话)更适合。这样可以轻松扩展到单台计算机支持的最大内存(2/4 TByte?)。在Gemstone中,通常不会进行非规范化以获得最佳性能。