WebServiceからの値でiUSERTYPEをプリロードします
-
27-10-2019 - |
質問
この郵便受け:
http://kennytordeur.blogspot.com/2011/04/nhibernate-in-combination-with_06.html
データベース以外のリソースからエンティティをロードする方法について説明します。この場合、ウェブサービス。これは素晴らしいことですが、1つのクエリに多くのクライアントをロードすると、それぞれが異なる海兵材を持つ場合、各クライアントのWebサービスを呼び出す必要があります。すべての結婚状態をプリロードする方法はありますか?各クライアントのウェブサービスに行き来する必要はありませんか?
解決
Hibernateがこれをサポートしているとは思わない。 'n+1問題問題」 よく知っている問題であり、Hibernateにはそれを扱うためのかなりの数の戦略があります(バッチ、サブセレクト、熱心なフェッチなど)。問題は、「N+1 Webサービスコール」があり、これらのメカニズムはすべて役に立たないことです。 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];
}
所属していません StackOverflow