簡體   English   中英

db4o和對象標識

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM