Domanda

Questo post:

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

Descrive come caricare un'entità da una risorsa diversa da un database, in questo caso un servizio web. Questo è fantastico, ma se carico un certo numero di client in una query, ognuno con una diversa statale maritica, dovrà chiamare il servizio Web per ogni cliente. C'è un modo per precaricare tutti gli stati coniugali, quindi non deve andare avanti e indietro al servizio web per ogni cliente?

È stato utile?

Soluzione

Non credo che Hibernate lo supporti. 'n+1 Seleziona problema' è un problema ben noto e Hibernate ha alcune strategie per affrontarlo (batch, sottoseletti, impazienza di recupero ecc.). Il problema è che hai una chiamata di servizio web n+1 "e tutti questi meccanismi sono inutili. Hibernate semplicemente non sa cosa stai facendo in iusertype. Si presume che tu stia convertendo dati già caricati.

Sembra che dovrai implementare il tuo precarico. Qualcosa come questo:

// 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];
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top