首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流畅的Nhibernate:并发地获取集合中的集合

问流畅的Nhibernate:并发地获取集合中的集合
EN

Stack Overflow用户
提问于 2012-08-21 22:00:15
回答 2查看 375关注 0票数 0

我需要急切地获取一个具有集合集合的实体,等等,这样我才能并发地处理数据(一个具有许多YELLOWEntities的事物实体,每个实体都有许多SubYellowEntities)。所需的关键代码是:

代码语言:javascript
复制
NHibernateUtil.Initialize(fetchedThings);

(请参阅下面接受的答案。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-09 23:52:45

解决方案(如果您可以改进,请继续并发布修订版本作为答案):在8个处理器上运行17秒(从97秒下降),结果正确。请记住,大部分时间都花在了计算上,而不是等待Nhibernate返回。

代码语言:javascript
复制
var fetchedThings = new List<Thing>();
var sessFT = Session.SessionFactory.OpenSession();
Task getThingsTask = new Task(() =>
   {
       fetchedThings = sessFT.CreateQuery(@" from Thing t " +
                             " inner join fetch t.BlueEntity " )
                             .SetResultTransformer(Transformers.DistinctRootEntity)
                             .List<Thing>();
        NHibernateUtil.Initialize(fetchedThings);
    });
getThingsTask.Start();

var fetchedYellows = new List<YELLOWEntity>();
var sessFY = Session.SessionFactory.OpenSession();
Task getYellowsTask = new Task(() =>
   {
        fetchedYellows = sessFY.CreateQuery(@" from YELLOWEntity y " +
                             " left join fetch y.SubYellowEntities " + ... )
                             .SetResultTransformer(Transformers.DistinctRootEntity)
                             .List<YELLOWEntity>();
        NHibernateUtil.Initialize(fetchedThings);
    });
getYellowsTask.Start();

getThingsTask.Wait();
getYellowsTask.Wait();

Parallel.ForEach(fetchedThings, thing =>
{
    thing.YELLOWEntities = fetchedYellows.Where(y=>y.Thing.Id == thing.Id).ToList();
    ...
    //...inner foreach() loop through 'YELLOWthings'... doing threadsafe stuff
    ...
});

//dispose the temp sessions
票数 0
EN

Stack Overflow用户

发布于 2012-08-22 03:29:53

目前的方法有几个问题。让我从新的角度来看这个问题。

我知道,您希望检索Things,它有多对一的BlueEntities,还有一个YellowEntities的集合,后者又有一个SubYellowEntities的集合。

与其使用join fetch、转换器和循环,不如研究实体和集合的batch fetching。

有了为BlueEntity、Thing.YellowEntities和YellowEntity.SubYellowEntities设置的良好批处理大小,您应该根本不需要第三方编程语言。

如果你这样做了,你将无法返回安全使用的实体,因为它们必须与单个会话相关联才有用,并且会话不是线程安全的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12056565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档