2012-10-22 54 views
1

我有一個由SQL服務器數據庫支持的.Net服務器應用程序。我使用nHibernate(流利)來處理所有數據庫操作。我正面臨嚴重的性能和併發問題,顯然來自於我並不是專家(甚至不是關於nHibernate和ORM)的專家。持久性與易失性數據混合

我有一些數據需要存儲在數據庫和一些數據不。例如,我有members class(顯然需要堅持在數據庫中),並且我也有(它只保存運行時數據,並且不需要保留)。也許我的例子不是最好的,但我認爲它證明了我的情況。登錄成員對象將具有類型爲Member的屬性,以便兩個類之間有連接。

有什麼辦法可以避免堅持某些類,但仍然能夠有一個完整的圖,包括持久性和「內存中」的對象?

+0

凡/當你創建你登錄會員實例? –

+0

這些實例是在用戶登錄時創建的,當它們註銷時會被刪除。至於「哪裏」,我不確定你的意思......(對不起) –

+0

還有其他建議嗎?我想盡可能保持圖形完整。對解決方案有任何意見建議? –

回答

0

我不確定對象圖是怎麼樣的,但爲什麼不讓會話弄清楚什麼改變了?

void DoSomethingWithMembers() 
{ 
    // if session which loaded the members is not open anymore 
    foreach (var member in loggedInMembers.Select(loggedInMember => loggedInMember.Member)) 
    { 
     session.Lock(member, LockMode.None); // reattach to session 
    } 
    // end if 

    // make changes to the (loggedIn)members 

    session.Flush(); // will persist any changes to a member 
} 

更新:爲響應註釋,像這樣

public AuthenticationResult Authenticate(string username, string password) 
{ 
    if (loggedInUsers.ContainsKey(username)) 
     return AuthenticationResult.AlreadyLoggedIn; 

    using (var session = OpenSession()) 
    { 
     var member = session.Query<Member>().Where(m => m.Name == username).FirstOrDefault(); 
    } 

    if (member == null) 
     return AuthenticationResult.NoUser; 

    if (member.Password != password) 
     return AuthenticationResult.WrongPassword; 

    loggedInUsers.Add(username, new LoggedInMember(DateTime.Now, member)); 

    var dto = mapper.Map<Member, MemberDto>(member); 
    return new AuthenticationResult(dto); 
} 

public void Update(ICollection<MemberDto> dtos) 
{ 
    using (var session = OpenSession()) 
    { 
     foreach (var dto in dtos) 
     { 
      Update(session, dto); 
     } 
     session.Flush(); 
    } 
} 

void Update(ISession session, MemberDto dto) 
{ 
    LoggedInMember liMember; 
    if (!loggedInUsers.TryGetValue(dto.Name, out liMember) 
     throw new AuthException("not logged in") 

    session.Lock(li.Member, LockMode.None); // attach 

    mapper.Map<Member, MemberDto>(li.Member, dto); 
} 
+0

感謝您的回答,雖然我不太明白。假設我有一個名爲AuthenticationService的WCF服務。客戶端調用方法「驗證」,提供用戶名和密碼。如果憑證與現有成員相匹配,則會創建一個登錄成員對象,該對象引用成員對象。只要服務器正在運行,我只需要登錄成員對象,我不需要將它保存在數據庫中,對嗎?有沒有辦法完成這樣的事情? –

+0

確定和loggedInUsers將被宣佈在哪裏?如何使其可用於所有對該服務的調用(來自其他客戶端),甚至可用於需要訪問已登錄用戶的其他服務? (目前我的服務都有InstanceContextMode = PerSession)。我想我可以把它變成靜態的,但這是一個「好」的事情嗎? –

+0

我用一個單獨的登錄用戶服務注入到容器中註冊的構造函數中作爲實例/容器生存期 – Firo