2011-09-06 34 views
1

這個職位值:預加載IUserType與web服務

http://kennytordeur.blogspot.com/2011/04/nhibernate-in-combination-with_06.html

介紹如何從不是數據庫以外的資源負載的實體,在這種情況下,web服務。這很好,但是如果我在一個查詢中加載了多個客戶端,每個客戶端都有一個不同的MaritialState,它將不得不爲每個客戶端調用Web服務。有沒有辦法預先加載所有的婚姻狀態,所以它不必爲每個客戶端來回訪問Web服務?

回答

1

我不認爲Hibernate支持這一點。 'n + 1選擇問題'是一個衆所周知的問題,Hibernate有很多處理它的策略(批處理,子查詢,提取等)。問題是你有'n + 1網絡服務調用',所有這些機制都沒用。 Hibernate根本不知道你在IUserType中做什麼。它假定你轉換已經加載的數據。

它看起來像你將不得不實施自己的預加載。類似這樣的:

// TODO: not thread safe, lock or use ConcurrentDictionary 
static IDictionary<Int32, ClientDto> _preLoadedClients 
              = new IDictionary<int,ClientDto>(); 

public Object NullSafeGet(IDataReader rs, String[] names, ...) { 

    Int32 clientid = NHibernateUtil.Int32.NullSafeGet(rs, names[0]); 

    // see if client has already been preloaded: 
    if(_preLoadedClients.ContainsKey(clientid)) { 
     return _preLoadedClients[clientid]; 
    } 

    // load a batch: clientId + 1, client + 2, ... client + 100 
    var batchOfIds = Enumerable.Range(clientid, 100); 
    var clientsBatch = clientService.GetClientsByIds(batchOfIds); 

    _preLoadedClients.Add(clientsBatch); 

    return _preLoadedClients[clientid]; 
}