【问题标题】:Db4o and object identityDb4o 和对象标识
【发布时间】:2011-08-30 16:52:19
【问题描述】:

我正在学习db4o数据库,打算用3层项目。

我不完全理解 db4o 中对象标识的概念。

假设我们有这样一个类:

public class User
{
    public Guid Id;
    public String SomeString;
    public Int64 SomeInt;
    public DateTime SomeDate;
    public DateTimeOffset SomeDateOffset;
    public TimeSpan SomeTimeSpan;
    public User SomeUser;
}

我从数据库中加载了 User 类型的对象,并将其所有成员更改为新实例。 Db4o 将如何确定如何处理成员、何时更新(替换)以及何时存储它们的新实例?

根据手册和身份概念,我的根对象引用保持不变,因此根对象是更新的,所有成员对象都有一个新引用,因此它会插入它们的新实例,但在这种情况下,我们有空间泄漏,旧的String、DateTime、TimeSpan、User 等类型的实例保留在 DB 中。

我们可以假设它删除了被孤立的对象(没有被任何人引用),但是根用户对象没有被任何人引用呢,如果我存储了纯 DateTime 对象或 Int32 对象呢?它会标记这种明确存储的对象,使其免于“垃圾收集”吗?这只是我的假设,有人可以解释一下这实际上是如何工作的吗?

【问题讨论】:

    标签: c# db4o


    【解决方案1】:

    db4o 使用对象标识来确定何时需要插入/更新对象。基本上它保持list of all objects seen during a session(使用RuntimeHelpers.GetHashCode())。当调用 Store() 时,db4o 只需扫描此列表以查找匹配项;如果找到匹配项,则更新对象,否则存储新对象。注意这个操作会递归执行(直到配置的update depth)。

    关于您关于“孤儿”对象的问题,db4o 没有有“垃圾收集器”,因此开发人员可以删除不再使用的对象。

    具体谈谈您在问题中提到的类型,字符串和 DateTime 将存储在父插槽中嵌入(它们不会有 id),因此存储它们所需的空间将是当它的父级被删除时回收; TimeSpan 对象将正常存储(即,将具有 id,因此开发人员需要删除它们)。

    基本上 db4o 将嵌入所有原始类型以及通过在对象的父槽中实现 IValueTypeHandler 的类型处理程序编组的任何类型(这不是漏洞,而是一个很好的近似值:)。

    希望这会有所帮助。

    【讨论】:

    • 我似乎在文档中找不到 Db4o 认为“原始”类型的类型列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多