[英]Db4o and object identity
我正在學習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將如何確定如何處理成員,何時更新(替換)以及何時存儲成員的新實例?
根據手冊和身份概念,我的根對象引用保持不變,因此根對象是更新的,所有成員對象都有一個新引用,因此會插入它們的新實例,但是在這種情況下,我們存在空間泄漏,即舊類型的實例字符串,日期時間,時間跨度,用戶等保留在數據庫中。
我們可以假定它刪除了孤立的對象(任何人都沒有引用過),但是對於root用戶對象,任何人都沒有引用過,如果我存儲了純DateTime對象或Int32對象呢? 是否會從“ GarbageCollected”中標記出此類明確存儲的對象? 這只是我的假設,有人可以解釋一下這實際上是如何工作的嗎?
db4o使用對象標識來確定何時需要插入/更新對象。 基本上,它保留了會話期間可見的所有對象的列表 (使用RuntimeHelpers.GetHashCode() )。 當調用Store()db4o時,只需掃描此列表以查找匹配項; 如果找到匹配項,則更新對象,否則存儲新對象。 請注意,此操作將遞歸執行(直至配置的更新深度 )。
關於有關“孤立”對象的問題, db4o沒有 “垃圾收集器”,因此由開發人員決定刪除不再使用的對象。
專門討論您在問題中提到的類型,字符串和日期時間將被嵌入在父插槽中(它們沒有ID),因此在刪除其父級時將收回存儲它們所需的空間; TimeSpan對象將正常存儲(即具有ID,因此開發人員需要刪除它們)。
基本上,db4o將嵌入所有原始類型以及通過類型處理程序編組的任何類型,該類型處理程序在對象的父插槽中實現IValueTypeHandler(這不是漏洞,而是一個很好的近似方法:)。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.