Db4o和对象标识

时间:2011-08-30 16:52:20

标签: c# db4o

我正在学习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;
}

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

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

我们可以假设它删除了孤立的对象(没有被任何人引用),但是root用户对象怎么没有被任何人引用,如果我存储了纯DateTime对象或Int32对象怎么办?它会标记这样明确存储的对象是否来自“GarbageCollected”?这些只是我的假设,有人可以解释这实际上是如何起作用的吗?

1 个答案:

答案 0 :(得分:3)

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

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

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

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

希望这有帮助。