2011-08-30 44 views
1

我正在学习db4o数据库,我打算使用它的三层项目。Db4o和对象标识

我不完全理解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型用户的负载对象,并改变了它的所有成员的新实例。 Db4o将如何确定如何处理成员,何时更新(替换)以及何时存储新实例?

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

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

回答

3

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

关于您关于“孤立”对象的问题,db4o不包含有一个“垃圾回收器”,因此它由开发人员删除不再使用的对象。

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

基本上db4o会嵌入所有的原始类型加上任何类型的编组,通过在对象的父槽中实现IValueTypeHandler的类型处理器(这不是洞故事,但是是一个很好的近似:)。

希望这会有所帮助。

+0

我似乎无法在文档中找到Db4o认为“原始”类型的类型列表。 –