我需要急切地获取一个具有集合集合的实体,等等,这样我才能并发地处理数据(一个具有许多YELLOWEntities的事物实体,每个实体都有许多SubYellowEntities)。所需的关键代码是:
NHibernateUtil.Initialize(fetchedThings);(请参阅下面接受的答案。)
发布于 2013-01-09 23:52:45
解决方案(如果您可以改进,请继续并发布修订版本作为答案):在8个处理器上运行17秒(从97秒下降),结果正确。请记住,大部分时间都花在了计算上,而不是等待Nhibernate返回。
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发布于 2012-08-22 03:29:53
目前的方法有几个问题。让我从新的角度来看这个问题。
我知道,您希望检索Things,它有多对一的BlueEntities,还有一个YellowEntities的集合,后者又有一个SubYellowEntities的集合。
与其使用join fetch、转换器和循环,不如研究实体和集合的batch fetching。
有了为BlueEntity、Thing.YellowEntities和YellowEntity.SubYellowEntities设置的良好批处理大小,您应该根本不需要第三方编程语言。
如果你这样做了,你将无法返回安全使用的实体,因为它们必须与单个会话相关联才有用,并且会话不是线程安全的。
https://stackoverflow.com/questions/12056565
复制相似问题