2011-08-30 72 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認爲「原始」類型的類型列表。 –