2013-01-24 53 views
1

每隔一段時間我的任務就是對數據庫中的一個或多個業務實體進行修改,這些業務實體可能已經緩存在我們的內部應用程序中。爲了讓應用程序能夠反映這些更改而不必循環使用應用程序池,我想我會嵌入開發/管理員從應用程序的用戶界面(完全或特定對象)中驅逐緩存的能力,但我注意到該方法狀態如下...SessionFactory.Evict的副作用?

/// <summary> 
/// Evict an entry from the process-level cache. This method occurs outside 
///  of any transaction; it performs an immediate "hard" remove, so does not respect 
///  any transaction isolation semantics of the usage strategy. Use with care. 
/// </summary> 
void ISessionFactory.Evict(Type persistentClass, object id); 

究竟是什麼意思?如果我試圖驅逐可能涉及交易的一個或多個對象,並且無論如何要避免這些副作用(如果它們具有破壞性),會出現什麼問題?我目前正在使用SysCache2,並且正在尋找如何使用SqlDependency的實現細節,但我仍然對Evict效果同時感到好奇。

UPDATE:在觀看的意見接近,看來SessionFactory.Evict()SessionFactory.EvictCollection()從工藝水平緩存中刪除,並從SessionFactory.EvictEntity()第二級緩存中刪除。然而,兩種風味都存在相同的聲明。所以我原來的問題仍然存在。如果某個實體正在另一個事務中使用,那麼從緩存中刪除(進程或第二級)實體有什麼危險?

回答

0

Evict將實體從會話中分離出來。

private static Book CreateAndSaveBook(ISessionFactory sessionFactory) 
{ 
    var book = new Book() 
    { 
     Name = "Book1", 
    }; 

    using (var session = sessionFactory.OpenSession()) 
    { 
    using (var tx = session.BeginTransaction()) 
    { 
     session.Save(book); 
     tx.Commit(); 
     session.Evict(book); 
    } 
    } 
return book; 
} 

在CreateAndSaveBook中,我們創建一本書並將其保存到數據庫中。我們提交我們的 交易,從會話中驅逐本書,關閉會話並返回本書。這建立了我們的問題。我們現在有一個沒有會話的實體。這個實體的變化沒有被跟蹤。這只是一個普通的普通書籍對象。

我們繼續更改圖書對象,現在我們要保存這些更改。 NHibernate 不知道我們爲這本書做了什麼。它可能已經通過大型應用程序的其他層或層。我們不知道它與哪個會話相關聯,如果有的話。我們甚至可能不知道該書是否存在於數據庫中。

+1

如果Evict旨在從會話中分離對象,如何從第二級緩存中使對象失效/驅逐出來? –

+0

通過SessionFactoty.Evict()和SessionFacyory.EvictCollection() –

+1

第二級緩存驅逐然後我認爲你誤解了我最初的問題,我想知道'SessionFactory.Evict()'的副作用,而不是'Session.Evict )'。我會修改評論代碼塊來表明這一點,但它已經在問題標題中提到了。 –